how to speed up a complex wp_query?

What the user has read is a property of the user not of the topic. You need this information per users and for this you need to stored values in the user’s meta. You might also want to know which users read a topic so your current system is not mutually exclusive, but it is conceptually bad which results in it being slow.