To keep it consistent with other commands, such as getrange, negative offset should count from the end.
Comment From: sundb
It used to be implemented, but I dont't know why it was removed from https://github.com/redis/redis/commit/8f8eeffec1fe1c0d40b6d078121661d7cfb02c08, but the comments tell us something.
/* Convert negative indexes. Note that for SETRANGE, the meaning of a
* negative index is a little different than for other commands.
* Here, an offset of -1 points to the trailing NULL byte of the
* string instead of the last character. */
Comment From: madolson
It seems weird that SETRANGE used to use a different semantic for negative offsets. If we support this, we should also add it for SETBIT perhaps as well.