Usually this is a sign of overdesign. The vast majority of programs simply do not need this.
If you really need to detect infinite loops in threads, then you should structure the thread logic to be in one main loop and have it "checkin" to a watchdog. The main loop is of course infinite (unless the thread is expected to "finish"), but that will catch any infinite loops nested in the main loop.
The problem is: what is this "watchdog"?
It cannot be another thread in the same AppDomain. It is completely improper to Thread.Abort
a thread in this scenario.
It could possibly be a thread in a separate AppDomain. Personally, I'm not completely happy with the "best-effort but not guaranteed" kind of cleanup that happens during AppDomain recycling, so I just avoid multiple AppDomains altogether.
It could be a process. This solution is fairly common in very important automation solutions.
It could also be another computer. This solution is used in critical automation solutions. Much of the work that I used to do involved watchdog processes on each computer combined with watchdog computers providing a sort of hot-backup failover cluster.
I can honestly say, though, that 98% of the time this question is asked, the answer is "just make sure you don't put an infinite loop in the thread in the first place." In other words, the huge cost of designing and implementing a watchdog solution is simply not within the scope of the real requirements. Design and code reviews combined with a good testing strategy is usually the best solution.