I can imagine it is useful for TCPSocket#write to accept only a part of a buffer crafted by somebody else. But I cannot think of any actual use case when #read is useful with that extension. Do you have one?
It is useful for read when user wants to read some data, and it wasn't enough (e.g. implementing gets) so you need to read some more at the end of what you already have.
I tried making a PR, but I think we should give up.
IO#read(length, buffer, offset) can work okay.
But doing the same for write is very hard because the interface is more general - it tries to write all arguments. It would need to be a keyword argument, and I'm not sure how you'd make it work since you can specify multiple arguments.
I think the solution here, for more complex use cases, is just to use IO::Buffer which supports this very naturally.