Unfortunately, this is not a zero-sum game. At some point, events can occur that make it impossible to maintain a proper "shutdown" time.
It is not clear to me that all Windows shutdowns will kill your session unless your users are impatient. Normally, what happens on our systems is that the user has stuff open, including my application, and clicks the shut-down button/option that appears when you click the Windows Start button at lower left, in the task bar. The shutdown code reaches my application, which sometimes will not allow you to exit. That hangs the shutdown, which gives two options - return to main window and resolve the hang-up, or force the issue and shut down anyway. You know that sometimes the user clicks the "Force" button. At that point, your session closure log is a lost cause. You can't stop that "Force" button but you can educate your users that it is not a good thing to use.
Another "gotcha" is the network-went-to-Hell-in-a-handbasket scenario. If you have a back-end that holds your data including audit logs, you will be unable to update the tables and that will cause traps. A Windows trap cannot interrupt another Windows trap so either the process hangs, totally dead, or it triggers Access itself to step in to resolve what is essentially a deadlock. But in either of those cases, your "closure log" is no longer possible.
If you lose power, you lose your ability to update doodlum-squat. I cannot find a way to convey the power-down trap from Windows through Access to the application, though there is such a thing as an API for most of the battery-backup systems that can send warning notifications. At least for my version of Access (2013), I can't find a Form event for PowerDown or PowerChange. The Windows Power Management API seems to be able to set the state of the system for inactivity changes and for long sequences of no activity (thus causing a power-save or a screen saver to activate.)
So my cursory search for three nasty scenarios turned up nothing.
Net result of this discussion: Always capturing the logout time is not something you can guarantee fully. Capturing the fact that the user's next logon seems to have involve an open session (and updating the session) might be all that you can do.