Right. So they ought to enforce that behavior but the problem is they don't know how. Because how do you tell the difference between someone storing data and someone storing bitcoin?
Easy. If someone is storing data, then that person could use OP_RETURN or witness data for that. Also, that person could use testnet, instead of bloating the mainnet. Or even that person could just commit to data, and store them on another chain, no chain at all, or anything, to get it timestamped by Proof of Work, commitments are enough. And commitments require no additional on-chain bytes, they can be attached to any existing transaction, before it will be broadcasted. Using "trap addresses" is the worst case, because there is no reason to do so. Also, it is more expensive than witness or OP_RETURN.
As you point out, it does have its limitations in the sense that you can't look up other peoples' transactions so if you needed to do that then you have to trust a 3rd party.
You don't have to trust anyone. You can use "importprunedfunds". You can ask any full node operator to execute "gettxoutproof" for you.