В конечном счете, кто-то должен нести ответственность за освобождение памяти, в которой хранится ваше возвращаемое значение. Это не может быть ваша функция преобразования, поскольку она вернется до того, как вы захотите освободить память.
Все становится проще, если вы используете std::string
вместо char*
s. Попробуйте это:
#include <msclr/marshal_cppstd.h>
...
GetSomething(msclr::interop::marshal_as<std::string>(str).c_str(), value);