Когда вы удаляете выделенную память, ОС не сразу возвращает эту память, а сохраняет ее зарезервированной для процесса, по крайней мере, до тех пор, пока другой процесс не будет нуждаться в этой памяти. Это повышает производительность, потому что самому процессу может понадобиться только что удаленная память через несколько мсек.
Чтобы действительно освободить удаленную память, вы можете позвонить
SetProcessWorkingSetSize(GetCurrentProcess(), (SIZE_T)-1, (SIZE_T)-1);
Может быть, это заставит GlobalMemoryStatusEx () вернуть ожидаемые значения?