Похоже, что ответ был действительно довольно прост: потоки создаются и умирают, поскольку пул потоков со временем увеличивается и уменьшается. Как правило, эти потоки имеют относительно длительный срок службы, что означает, что они заканчиваются в поколении 2. Поэтому они естественным образом очищаются только в полном цикле GC.
Интересным моментом является то, что приложение с очень хорошим управлением памятью может закончиться множеством мертвых потоков, которые я смог наблюдать в WinDbg. Это потому, что полный сборщик мусора может произойти только через несколько часов или даже дней! В одном блоге MS говорится, что эти мертвые потоки не очень хорошая вещь, поскольку соответствующий неуправляемый объект потока C ++ выглядит довольно ресурсоемким (к сожалению, найти этот чертов блог невозможно. Мне интересно, является ли это одним из тех редких случаев, когда индуцированный полный GC имеет смысл в определенный промежуток времени.