It's easier with zsh:
for ((i=2#$a; i<=2#$b; i++)) echo $(([##2]i))
Or with 0-padding:
for ((i=2#$a; i<=2#$b; i++)) printf '%04d\n' $(([##2]i))
Otherwise you can use bc:
echo "ibase=obase=2; for (i=$a; i<=$b; i++) i" | bc
Or dc:
echo "2doi $a [p1+d$b!<a]dsax" | dc
To 0-pad, you can always pipe the output to:
sed 's/^/000/;s/^0*\(.\{4\}\)/\1/'