Сразу скажу, я пока rust только изучаю...
Решение ваше подозрительно только в том, что вы в раст не передаёте размер выделенного в си-коде буфера, на который указывает out. Если строка s_raw получится слишком длинной, то при копировании результата в out может произойти запись за пределы буфера. Поэтому к параметру out нужно ещё передавать размер памяти, на которую он указывает. Т.е. если len будет больше, чем размер памяти, адресуемой out, жди беды.
Пример из книжки работает только потому, что возвращается указатель на строковый литерал — память для него после выхода из hello_rust не освобождается. Если возвращать указатель на переменную, выделенную в раст, память освободится и в Си коде можно получить уже непредсказуемый мусор.