Empty blocks are only seen shortly after a block change.
Bitmain was producing them minutes after a block change, and was producing-- prior to the blow up about covert AB-- upwards of 10% empty.
Your theory pretty much is saying that Bitmain runs every large pool

Not at all, however Jihan directly claimed as much to me. I think it was largely but not entirely bluster, they very clearly ran several that in public they claimed were "independent".
Edit: I should add, in case it's not obvious, if Bitmain decided to use Covert AB only 5% of the time - the first work sent out after a block change -
I think you may misunderstand what is being claimed there: It takes time to find the collisions needed for covert AB. When a block change happens, what do you do when you don't have a collision? You mine an empty block where the collision has been precomputed, as that takes no time at all. Once you find a collision with transactions you switch to that. Sometimes finding a collision takes a rather long time, because you get unlucky.
I agree that it's speculative: the extremely high rate of very late empty blocks could also be attributed to poorly run software and there is plenty of evidence of that. Bitmain controlled pools producing blocks that were invalid because of out of order transactions, where the tx order is what bitcoind would produce but swapped at some interior node in the hash tree is a lot harder to explain.