And it even misses some in testnet4.
Of course. Because blocks are propagated in the first-seen model: if you hear block A, and later you receive block B, at the same height, then it is accepted, but not propagated further.
Also note, that anyone can make a CPU stale block, at any point in time. And then, by default, the client will get only your block header of the stale block, and not even ask about its content. And of course, it won't pass it to the rest of the network.
Which means, that even if you will have perfect communication with a lot of nodes, you will still miss some stale blocks, just because the default rules are designed to not share them, unless necessary, or explicitly asked for.
By the way: you can start a few regtest nodes, and start producing stale blocks. Everything on 127.0.0.1, no communication problems. And then, you will see, how stale blocks are not reaching everyone, if you don't have N(N-1)/2 total connections for N nodes.
Edit:
The testnet4 node cannot start because between the time it shut down, and the time it started again, the chain had been reorged, and it gets Error: Cannot read last block filter index. The only way to restart is to reindex using bitcoind --reindex.
Try to reproduce that in regtest. If you succeed, then you can submit it as an issue into Bitcoin Core.
If not, then it may be related to using an unofficial version: if you run the official client, and your modified version, by using the same data directory, then changes from one version may be incompatible with the other, and it may lead to some crashes, or weird bugs.