It turns out that Zeacom's Desktop Voicemail is the culprit. It can be configured to read Outlook contacts, and when it is so configured, it does not release Outlook from memory. The user was closing Outlook first, then shutting down. Since Zeacom's app left Outlook open, that did not give Outlook a chance to write the cache file before the system terminated.
The user is now closing Desktop Voicemail first, then Outlook, and the cache is successfully writing. We've submitted a bug fix request to Zeacom.