There's no way around this. In general, it happens when threads are moved. The forum is marked as read as of time X, but if a previously unread thread with time < X gets moved there, the system thinks it's read.
Ironically, the only way around this would actually make a mark all read function completely infeasible.