I think it's because of the way WoM handles the units. Each unit has several "slots" to put equipment on. Multiply that by the amount of units (escpecially with groops of units), and your memory goes bye bye. most other games don't allow you to completely customize your regular troops.
We pay a big price to be able to customize our troops.
Speaking as a coder... it's really hard to speculate without being able to see the data structures in use. But it's not just "3d is bad". Sins of a Solar Empire is 3d and it can have comparatively huge numbers of units active at once without memory issues. If you backtrack before mines were added you could scale it up to crazy levels (mines appear in such numbers that they chew up a fair bit). Sins is also rather pretty for a strategy game.
Civ IV has really big maps and a ton of units stacked in them, and without a mod I've never managed to hit an OOM error in that. Civ 5 has fewer units but the huge map is still fairly large (though I believe it's smaller then the Civ 4 one, but it's hexes so it gets more love from me). Sanctum has up to 100 units on the screen at once being shot at by 50 more units (towers) and 4 players. It's 3D and doesn't run out of memory. And if you want to really push it, the Xbox 360 has 512MB total to work with, and almost everything on it is 3d. Clearly this can be done. 
Since customization was mentioned specifically, I think the price you pay for that in memory is being overblown. In its simplest form you can do 10 item slots on a character with an integer array of size 10, where each array element represnts the item ID equipped in a slot. To load the unit's current attack power, you load it's base attack power (a unit property) * people in the unit (another property), then load the attack value of every item in that array. For speed purposes you'd cache that as part of the unit so you don't have to load it again.
But a 10 slot int[] is 40 bytes. Base ATK is 4 bytes assuming they use an int32, which they really don't have to (what has attack power of 2 billion?). Units in the stack is another 4 bytes (or less), and caching the current total attack power is 4 bytes.
If you decide to be more flexible and use a Linked List instead of an array, you're adding some pointers in there (if it's a doubly linked list it's 8 bytes for pointers per item in the list). You'd need hundreds of items to get up to 1KB of memory, and thus thousands of units to get to 1MB. You've got 2GB to work with here.
Now it's entirely possible to implment this in a memory-sucking way, but it doesn't have to be. You could fit an entire stack of units into 1KB easily, which means you'd need ten thousand of them to get over 10MB used by every unit on the map.
Like I said, I don't know where the memory is going. But I'm trying to illustrate a point here: blaming unit customization for OOM errors and small unit counts seems pretty silly without internal knowledge of the code.