From documentations on zrangebyscore:
Keep in mind that if offset is large, the sorted set needs to be traversed for offset elements before getting to the elements to return, which can add up to O(N) time complexity.
I know a little about the code, but since it is possible to do zrange in logarithmic time for small outputs, I think it is possible to skip offset in zrangebyscore in O(log N) rather than in O(N).
Here is a pseudo-code:
function zRangeByScore(key, min, max, offset, count)
{
first = zRangeByScore(key, min, max, 0, 1)->first(); // O(log N)
if (first is null) return null;
start = first->rank() + offset; // O(log N) or O(1) depending on the implementations
last = zRevRanbeByScore(key, min, max, 0, 1); //O(log N)
stop = min(last->rank(), start + count);
return zRange(key, start, stop); // O(M + log N) instead of O(offset + M + log N)
}