Как оптимально организовать структуру памяти, Кучу? Как она реализована в виртуальных машинах?
Там не происходиит копирование данных. Просто среда выаолнения запоминает, что переменная a лежит вон там внутри "массива" кучи. При чтении оттуда данных все происходит за одну асскмблерную операцию, как если бы вы читали из int.

Пишущим на си++ из-за концепции указателей это все должно быть понятнее. При выделении данных на куче просто какой-то указатель указывает куда-то в кучу и все.
sharplab.io напишите код, и посмотрите как будет выглядеть asm после jit`а, только в release сборке.

ну и если уж совсем внутренности CLR интересны, советую начать с книг Саши Гольдштейна и Станислава Сидристого