When a thread is deleted, XF\Entity\Thread#_postDelete() fails to clean some tables, such as xf_thread_watch. At the end of the method, it cleans thread reply bans:
I would expect it to handle xf_thread_watch and xf_thread_user_post there as well, but it seems to skip those. xf_thread_watch appears to retain entries indefinitely.
$db->delete('xf_thread_reply_ban', 'thread_id = ?', $this->thread_id);