One place Thread.Abort could be useful is when interacting with unmanaged code. If you make a synchronous call to unmanaged code, that .NET thread is completely dependent on the unmanaged code to return control.
Unfortunately, if the thread hangs, you won't be able to deal with it using Thread.Abort. All calling Thread.Abort does is mark the thread for termination. The termination flag is checked prior to executing each managed instruction. When you're hung in unmanaged code, you never get to executing the next managed instruction!