I have a similar problem: I work with a class called _bstr_t in COM and the ubiquitous CString for MFC, and I commonly mix them up (I have to do this as MFC does like it's own CString for some functions and working with BSTRs can be nasty), but when I can get away with it I use the standard library.
You can use a std::string and a std::stringstream with no problem, together they can easily manage your usual calls to Format. Also, I often typedef them so I can use them with UNICODE.
//undefine both of these for UNICODE
typedef std::basic_string<TCHAR> string;
typedef std::basic_stringstream<TCHAR> stringstream;
TSTD::string str = _T("Hello World");
ss << _T("This is an int - ") << 10000 << std::endl;
ss << _T("This is a floating point - ") << 5.69 << std::endl;
ss << _T("This is a string - \"") << str << _T("\"");;