Ok, it started happening again, and I was able figure it out, thanks to Casey's tip -
I checked the main thread this time, and it showed me that the function call that hangs is Sleep().
Back when we added fixed frame rate, I found I was going over the target frame duration by a little bit relatively often. I tried mitigating the issue by subtracting a millisecond from the amount of time we should sleep, meaning we'd spin and hog the CPU for a millisecond. It seemed to work fine, at the time.
Turns out that if there wasn't a full millisecond available to sleep, the DWORD-stored number of milliseconds to sleep was truncated to 0, so I was subtracting 1 millisecond from 0 and the underflow resulted in me requesting a LOONG sleep from the OS.
Thanks for the help, I really appreciate it.