Last time I tried this, I discovered that input arguments of pointer types were not modified in place, instead additional output arguments were returned containing a copy of any pointer type input with any changes.
You can see this fact with:
>> libfunctions MyDll -full
Functions in library MyDll:
[int32, cstring, stringPtrPtr] MyFunction2(int32, cstring, stringPtrPtr)
The weird thing is that when I just tried this again on the latest R2013a, input arguments are indeed modified. Something must have changed since then :)
So in your case, you should call:
info = libpointer('stringPtrPtr',{''});
[val,~,info2] = calllib('MyDll', 'MyFunction2', 666, 'kikou', info)
and check the output info2