Bob, That’s very cool, out-of-the-box thinking. Congrats, and thanks for sharing.
Your solution works because of the lag. In MSP, relationship lags are always computed according to their successor’s effective calendar, so assigning the calendar to the milestone effectively shifts its predecessor lag into the end-of-day period. The milestone itself does not obey the calendar, but it must respect its predecessor relationships that do.
I can’t find a good reason for the double-shift. Combined with your 1-minute lag, one shift from 17:00 to 17:01 seems to work for me, but maybe I’m missing something.