Судя по тестам, флеш оптимизирует хранение простых типов внутри массивов (если в массив сохранять только int, то размер 4 байта на ячейку массива!!!). А вот если сохранять Number, то флеш его сначала обволакивает в объект, и хранит ссылки на эти объекты (в итоге 8 байт double + 4 байт ссылка (на 32бит) ). При присваивании нового значения, если тип неизвестен, то он заново создает объекты оболочки, а старые удаляет (при этом не все, по ходу, оптимизирует для повторного использования, хотя судя по всему, тупо глючит).
System.gc() при этом действительно не помогает - объекты оболочки хранятся в обход сборщика мусора (видимо для уменьшения нагрузки на него).
Чтобы убрать такой эффект, необходимо исправить на:

Код AS3:
package
{
import flash.display.Sprite;
import flash.system.System;
public class Main extends flash.display.Sprite
{
private var d:Array
public function Main():void
{
var n:int = 10000000, i:int;
d = new Array();
trace(System.totalMemory);
for (i = 0; i < n; ++i)
d[i] = 0.123;
trace(System.totalMemory);
for (i = 0; i < n; ++i)
d[i] = Number(d[i]) + Number(d[i]) + Number(d[i]) + Number(d[i]);
trace(System.totalMemory);
}
}
}
Тогда компилятор знает тип и не создаёт заново оболочки ( временные скачки по памяти убираются System.gc() или со временем)