This is technically undefined behavior and the standard is silent on the results of aliasing pointers like this. A standards pedant would say that invoking undefined behavior in this way could result in anything from corrupted data to a system crash to Ragnarok.
Pragmatically, this depends on your hardware. Most modern systems (eg x86, x64, PPC, MIPS, ARM) handle word-sized writes in the way you describe, with the exception that writing to an unaligned address will result in a crash. Also, this is when endianness comes into play; on a little endian system
char foo[4];
*((uint_32*)(foo)) = 0x01020304;
// the following are now true:
foo[0] == 0x04;
foo[1] == 0x03;
foo[2] == 0x02;
foo[3] == 0x01;
The short answer is that this isn't safe unless you know exactly what hardware your program will run on.
If you do control the hardware you compile for, then you can predict what the compiler will do; I've used this trick to speed up packing of byte arrays on embedded systems.