Cortex M3 GPIO address (LM3s300)
For your first question, check out page 227 and Section 7.2.12 in the datasheet for the part. I think that might explain the behavior you are seeing -- it's not a straightforward data register you can read/write to.

You'll note that the GPIODATA space is 0x400, or 2^10 sized. Seems overkill to just work with 8 bits, right? For writes to this register, bits 9 through 2 are used as a bitmask. So when you tried to address 0x40004000, your bitmask was all zeros, preventing you from modifying any part of the register. The lower two bits are the "real" address that gives you access to the 8-bits of GPIO you actually have.

So, if you always wanted to edit the entire register at once, your address range would be 0x400043FC through 0x400043FF. That sets bits 9 through 2 to 1, allowing writes to all bits of the register. This is a powerful capability that prevents you from having to do manual bitmasking / read-modify-write operations. This is why the edX course example code works as they use a memory address that enables writing to each bit.

As for your second question, should you not be using the bit-band alias region starting at 0x42000000 instead of the direct region at 0x40000000?