I had a look at the views package and I think it is worth using it if it makes available a service we can use.
You say that you cannot know when the thread was viewed. But in the datamodel I see that there is a field last_viewed in table views, and also it is not that important when it was viewed, but if it was viewed.
I do not understand either why you say that you have to do a count to know if a thread is read. But it seems important to me to store the number of read threads per forum in a denormalized table, as my code does in table forums_reading_info_user.
I think that we could use the views package instead of table forums_reading_info, but still use table forums_reading_info_user (possibly with another name) for storing the count of read threads.