Thanks to @neil, my understanding is that
Discourse will remove unpinned topics from the lists on the categories page if the user has seen them (code here).
I would propose that is too strong. If a pinned post has been read, but is still one of the three most recent topics in its Category, it should remain on the list in the Categories view.
In my community, sometimes a pinned post is not an announcement, but a conversation starter. The current code is useful for announcements that only need to be read once, but there are other reasons to pin posts.
I would recommend removing this code or having it be configurable.