Beim letzten Beispiel fehlt das PROGMEM in dem Array aus byte*. Das heißt diese Zeiger stehen im RAM und nicht im Flash. Dann funktioniert die Adressierung mit [][] ohne dass man den Zeiger extra kopieren muss.
Wenn man die Zeiger auch im Flash speichert (was sich hier nicht unbedingt lohnt) muss man erst mal den Zeiger mit pgm_read_word_near() kopieren. Dann kann man den Index einfach drauf addieren. "word" weil Zeiger eben 16 Bit breit sind.