Not sure if that's a good idea. Strings are immutable so you can pass string to function by reference, in thread safe manner. So if you pass same string to 2 threads and one of them modify it - you'll really have allocate+copy+modify so you're never touching the original thing so you can't have a race.
Now if go introduced readolny []byte, we'd probably want to change all io functions to use that... and this would create a lot of confusion, because it'd be required to cast []byte to readonly version. And this casted variable wouldn't be readonly nor thread-safe at all, because underlying memory could still be changed using the original slice. So we'd need allocate+memcopy for readonly cast to do a network write.
Or maybe there could be readonly []byte version for each io op. But it'd result only in many unnecessary OS calls.
So what is needed in this case (i guess) is a reusable buffer anyway, and then you can do a copy to a byte buffer without a cast and allocation
tstr := "abc"
t := make([]byte, 10, 10)
copy(t, tstr)