Ну да, цикл большую часть времени "просиживает" в ядре, в NewRec.
А поток-"прерыватор" перед генерацией исключения в основном потоке приостанавливает его и проверяет, что он находится не в ядре. В противном случае он его возобновляет - и пытается поймать снова. Т.е. делает "пробуксовку" до тех пор, пока не поймает не в ядре. А если за секунду пробуксовок не поймает, то ничего не делает.

В .NET применен альтернативный пробуксовке трюк - подмена адреса возврата. Тогда поток сам "прыгает в объятия" на выходе из ядерных процедур...