I thought that multiple threads cannot call the same global function.
That depends on whether the called function is thread safe or not.
Since wxString::FromUTF8 is a static function it actually acts as a global function, am I missing something?
Now that you mention it, i may have read somewhere that the CSConv classes are not thread safe, i don't know if this is (still) true. So, if you want to be safe, you will have to implement your all small helper class with a mutex to ensure thread safety.
Is it neceserry to make deep copy twice? Since it is already done once in the conversion from string to wxString as shown below:
In this particular case you're right, because the string object goes out of scope immediately. But i'd always enforce deep copy at the latest possible stage and not rely on the fact that it's ensured somewhere earlier in the code.