I understand that superfetch basically pulls stuff that you will likely need, and caches it in RAM, so why is it not utilizing this space?
Superfetch tries to determine things you will likely need in the near future and and loads it into memory, thereby hopefully making the computer respond faster.
As a counter question -- considering your whole running system takes up ~4GB of RAM, with 2GB standby, what do you run frequently that would take up an extra gig or two of memory?
I notice that the largest amount of free space occurs when I close a program. Why is it not keeping the data from that closed program in RAM, so it could boot up to the exact same state faster?
Clearing used memory is an inherent feature of every program because not doing so can cause issues with any program that wants to use that same memory in the future. In fact, (re)using memory that is already in a specific state is a major bug in programming because data is interpreted differently by different programs or even by the same program between runs.
Likewise, "boot[ing]up to the exact same state" is likely undesirable for many programs. I learned my lesson in old-school Tomb Raider -- never save while you're on fire.
Kidding aside though, there are many reasons it is undesirable to retain data between sessions, especially if there is an error. This also assumes an awareness of the program that Windows might not have (what do we retain?).
Also consider programs that are not used frequently or that actually cause a spike in memory use. If there is little or no free RAM, memory has to be cleared for use. Often this can result in writing to disc (and subsequently reading from it likely later), which is much slower than RAM.
Finally, as a comment, I think the assumption about data size is wrong here too. It can take a large amount of memory to run a program but unless your are doing something with multimedia, program "data" tends not to be very large. For instance, Firefox on my machine requires about ~300MB of memory. But any web page "data" is almost certainly under 20MB.
If you are absolutely set on using that memory, here are two thoughts:
Review msconfig and make sure there is no memory limit in place. There is no indication this is an issue but you can double-check that Windows is set to use the maximum amount of memory it can.
Create a RAM disk. It sounds like you really want that memory used and this could be a good way to do that, especially since you seemed concerned with program speed.