Эксперимент показал что короткий ответ на этот вопрос: да.
Если подробнее, то вызов
P := VirtualAlloc(nil, $40000, MEM_COMMIT, PAGE_READWRITE);
успешен. Я вставил этот вызов в такое место в программе, где адрес выделеного блока получался всегда одинаковым (в моем случае $B80000)
Я переделал вызов так
VirtualAlloc(pointer($B80000),$40000, MEM_COMMIT,PAGE_READWRITE);
И вызов дал ошибку, в точности как и описано в вашей цитате из MSDN
А такой вариант вызова
VirtualAlloc(pointer($B80000),$40000, MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
отработал как нужно.
Поэтому длинный ответ получается примерно таким:
Если вы указываете адрем памяти, который хотите выделить, то функция щитает, что вы сами следите какие регионы у вас выделены, а какие просто зарезервированы. В этом случае она строго относится к флагам MEM_COMMIT и MEM_RESERVE, чтобы вы не могли поламать свою логику отслеживания состояний каждой страницы. Если же вам все равно, где будет начинаться выделяемый регион (вы указали nil первым аргументом), то это означает "просто дайте мне какой-нибудь памяти". И в этом случае MEM_RESERVE подразумевается.