Перечислите, пожалуйста, все способы, которыми может выйти поток (не роняя при этом всё приложение). У меня один поток оказывается уже несуществующим, когда доходит до его штатного завершения и join(). Ума не приложу, как он вышел. Точно не по исключению, не по ExitThread и не по достижению return из функции потока. Вроде бы и не упал - по крайней мере, отладчик и Application Verifier ничего не видят.
Windows 10 x64, MSVC v142, 64-битный процесс.