Das funktioniert nach dem gleichen Prinzip, nur dann brauchst du praktisch nichts in der Session speichern.
Du speichst zu dem User (z.B. in der Datenbank) einen "Alles gelesen"-Zeitpunkt, alles vor diesem Zeitpunk ist gelesen, alles danach nicht. Und zusätzlich dann eine Liste mit Themen, die von den ungelesenen ausgeschlossen werden, also bereits gelesen sind.
Allerdings hast du dann unter Umständen Probleme mit der Menge, die du speichern musst. Stell dir mal vor ein User ignoriert bestimmte Themen einfach und liest sie niemals - drückt aber auch nicht auf den "Alles gelesen"-Button.
Dann würde es niemals dazu kommen das der "Alles gelesen"-Zeitpunkt mal aktualisiert wird, sondern deine Liste der Themen die er bereits gelesen hat wird einfach nur immer länger.
Das könnte man natürlich umgehen in dem man sagt, ein Thema wird unter bestimmten Bedingungen trotzdem als gelesen markiert (z.B. seit X Tagen keine neuen Beiträge im Thema, aber der User hat noch nicht rein geschaut).
Diese Gedanken sind allerdings rein theoretisch, ich habe das bisher nicht nachgerechnet wieviel Speicherplatz da gebraucht wird und wie schnell das zu einem Problem werden kann - alles nur spontane Überlegungen

Das Problem was du beschreibst, also ein User liest bei einem Besuch nur X von Y neuen Beiträge, beim nächsten Besuch sind aber alle Y als gelesen markiert, dürftest du bei den meisten "großen" Forensystem haben. Als ich mich das letzte mal mit diesem Problem befasst habe, war es auf jeden Fall noch so.