1) Why to you join the forum table?
You don't really need that as you can get the forum title from forum cache.
In theory the join is correct, but what is theoretetically correct is not necessarily the best thing to do performance wise
2) If you want the most up-to-date data with minimal db load, i'd add a hook on threaddata_postsave to invalidate the cache when the thread status (visible, forumid) changes.
When you display the results, check if the cache is there if not: build it.