Вообще, скорее всего, просто у тебя есть необработанное исключение, которое из потока никак себя внешне не проявляет. На самом деле поток уже закончился, а вот объект продолжает "висеть". Оберни все тело Execute в try...except и залогируй ошибку:
Код:
procedure TMyThread.Execute;
begin
Try
// весь твой код здесь
Except
On E : Exception Do
// здесь записать куда-нить, например в файл, текст ошибки E.Message
End;
end;