So I wonder why do you need to copy the whole string on writing a single byte ?
The copy-on-write mechanism is for passing by value parameters to chains of methods. Multiple methods might only pass it on, but don't need a deep copy, only ref count increase.
If some method starts modifying though, if you wouldn't copy, after the method is finished, and the calling methods continue they would see the modified string, not the original, despite passing by value.
So the whole idea is lazy by-value semantics.
As far as pchar does, since (ansi/unicode)strings are null terminated, there are some easy conversions to/from pchar for external API interfacing purposes. Note though that pchar's can't contain NULLs as part of the string data, and strings CAN!
Also it means that a pchar pointing into a string is only safe as long as the string remains in scope.