Using VirtualAlloc in 32-bit OS is perfectly fine. In fact on Windows that is pretty normal way how to allocate memory from OS in your application. malloc/new and other C/C++ functions allocate memory by using VirtualAlloc.
What Casey mean why it is not such a good idea is that because he is allocating in pretty large chunk - gigabytes. For 32-bit application max memory it can use is 4GB (max value addressable by 32-bit pointer). By default Windows OS reserves upper 2GB to itself (for kernel32.dll user32.dll and other things), so what is left for application is lower 2GB. Although there is a switch to change it to 1 vs 3GB. That said you need to remember that in those 2GB or 3GB left for application there is exe loaded, bunch of dll files loaded. So at the end it is pretty fragmented chunk of memory. You probably won't be able to allocate anything larger than 500MB or so. So you need to design your memory system to allocate memory in multiple chunks which will not be next to each other. That is what malloc is doing. It allocates only what you ask (more or less), and not 2GB at startup. And that is what Casey is doing in asset system - loading into independently allocate chunks. On 64-bit you could simply reserve memory in one call for whole asset file and then just commit whatever you want to load.