Now, this is strange. After restarting Matlab, wavread() and wavwrite() are now symmetric and handle the full range of float values instead of clipping. It looks like I had some kind of weird modal problem that a restart fixed. Go figure.
Past experience (lots and lots of it) had led me to believe that was the case so I was extremely surprised at the clipping behavior I was seeing.