Компилятор выделяет под new A память для хранения всех производных классов?
конечно нет, он не знает всех производных классов, если вы напишете new A то вам и выделят память под объект типа A.
Другое дело что в вашем примере вы выделяете память под объект типа B, а не A:
A* a = new B(2);
так что не очень понимаю ваше удивление, вы выделили памяти достаточно.