grep tends to run out of memory since it reads until end-of-line, but in binary data there might not be an end-of-line for a long time. You could still use grep by grepping chunks of smaller-than-memory size, roughly:
# dd bs=1M iflag=fullblock if=/dev/sdb skip=X count=Y | grep ...
Rinse and repeat for all chunks. If you're not sure about whether the data will be aligned properly, make the chunks overlap some (next X=X+Y-1).
strings would probably avoid the running out of memory part (very long lines of printable ASCII are unlikely to appear). Then you have a list of offsets to check. These can be false matches since
strings excludes the
# strings -t d -n 4 /dev/sdb | grep 'LUKS$'
# losetup --find --show --offset=23068672 /dev/sdb
# cryptsetup luksDump /dev/loop9
binwalk (with a custom magic signature) might be able to locate LUKS headers more efficiently. But for a quick hack,
strings usually works well enough.