Finally! I did have high hopes on that last fix.
We were starving the thread pool for the IDE. It wasn't obvious, but the background threads being used for transferring NCrunch data into editor windows were being allocated from the same pool as the threads used by the IDE for everything else, which apparently has a limit. This explains the erratic nature of the issue, and why the freezes were of variable length. When the IDE would try to allocate a thread for an important foreground task, it would sometimes need to wait until a thread became available. The problem would get worse when more editors were open in the IDE.
Interestingly it wouldn't take many threads for the pool to hit the limit. The IDE must run quite close to it during normal operation.