How do you expect a 32-bit program with no knowledge of 64-bit processors to be able to tell the OS to not give it the full 4 GB, because the developer wasn't careful?
That happens by default on Windows. By default, programs only get 2GB of address space, and Windows "uses" (just doesn't give out, really) the other 2GB.
If a programmer thinks they're careful, they opt into the larger address space by setting the IMAGE_FILE_LARGE_ADDRESS_AWARE flag in their PE header (usually by passing a linker flag).
So now we can get to your question, and there are two answers:
1) Even if a program doesn't have knowledge of 64-bit Windows, they can still get some benefit from setting that flag: on a 32-bit Windows system configured to support it, they'll get a 3GB address space instead of 2GB.
2) If a program has no knowledge about the large-address-aware flag at all, then they "tell the OS to not give it the full 4 GB" by doing nothing.
In Firefox's case, Mozilla has set this flag:
C:\Program Files (x86)\Mozilla Firefox>dumpbin /headers firefox.exe
...
FILE HEADER VALUES
14C machine (x86)
...
122 characteristics
Executable
Application can handle large (>2GB) addresses <--
32 bit word machine
...
(You could probably actually modify the Firefox executable to unset that flag and stop it from using above 2GB of user memory, but I'm not sure what would happen or if there are other mechanisms that can overrule it or whatever.)