Я бы просто использовал блокированный счетчик; увеличьте это (Interlocked.Increment) перед запуском каждого потока, и пусть каждый поток вызывает Interlocked.Decrement непосредственно перед выходом. Затем вы можете использовать Thread.VolatileRead в любой момент, чтобы узнать, сколько из них активно, без какой-либо коллекции.
Однако, специально для решения вопроса: если вы используете коллекцию, потоки, устанавливающие элемент в null, тоже должны блокироваться:
lock(ThreadCollection)
{
ThreadCollection[index] = null;
}
Счетчик кажется мне чище.