You can use tail -c+N to trim the leading N bytes from input, then you can use head -cM to output only the first M bytes from its input.
$ echo "hello world 1234567890" | tail -c+9 | head -c6
rld 12
So using your variables, it would probably be:
tail -c+$offset inputfile | head -c$datalength > outputfile
Ah, didn't see it had to seek. Leaving this as CW.