As sik mentioned above, it's only useful for programming at a level where you're interacting with some hardware detail, not general use. So there's not much incentive in adding overloads to ostream that only driver-authors will use (or won't use).
b) there aren't volatile overloads in the standard library?
IMHO, I actually prefer the style where you read memory into local variables before using it anyway:
volatile char* data = .. char c = *data; cout << c;
I try and avoid mentioning threading and volatile in the same sentence, because too many people already think they go hand in hand. If you're using the C++11 standard library's threading primitives, you don't need volatile. You only need it when interacting with hardware designed to support multi-threaded code, such as when implementing said primitives, or if you're writing dangerous multi-threaded code that makes assumptions about the underlying hardware.
didn't support any form of threading