The orphanage limits the "usage" of the orphans it stores, per peer and globally, to bound the amount of memory an attacker can make us hold on to. Weight was used as a proxy for that memory, on the assumption that it is "often higher than the actual memory usage of the transaction".
That assumption does not hold. Every witness stack element is an individually heap-allocated vector, costing its 24-byte slot in the stack vector plus a 32-byte minimum allocation, while only weighing 2WU. A transaction of 199,000 1-byte witness elements weighs 398,247WU (i.e. it is a standard weight, and witness standardness cannot be checked while the inputs are missing), but uses 11.1MB of memory: 28 times what is accounted for it.
Account the memory the transaction actually uses instead, and derive the per-peer reservation from the largest orphan we are willing to store, so that a peer relaying one maximally-sized orphan still stays within its allowance (and therefore cannot cause any evictions). Orphans that would not fit in that allowance are now refused by AddTx() rather than stored and immediately evicted again by LimitOrphans(), which would first push out the announcer's other orphans: with weight accounting, a peer that had 10 normal orphans and relayed one maximally-sized one kept 9 of them; accounting memory without the new limit would leave it with none.