The thread's stack is not stored on the LOH because the stack is not a CLR object. The thread's stack is allocated by the operating system when .NET asks for a new thread.
A CLR thread is a thin wrapper around an operating system thread.
If you really do have a memory leak, you can be sure that it's not in the thread objects themselves.