Okay, you still there? First, you can use pgm_read_byte_near or simply pgm_read_byte.
The pgm_read functions want an address. When you issued your statements that 'worked' (i.e. Serial.println(pgm_read_byte_near(waveTable[1])); ), you were passing the base address of waveTable[1], ignoring the fact that waveTable is a two-dimensional array. What you saw as 'correct' output was merely index zero of each array. This (unfortunately) will not generate an error or even a warning as it is valid syntax, if that's what you want. By definition, the name of an array is a pointer to the base address of that array. To cycle through the addresses of the array, you either add the length of the array member (in this case uint8 which is 1) or reference the array member.
In code-speak this is base_address + offset or &base_address@.
In your case, with a two-dimensional array, you want waveTable[currentWave] + offset or &waveTable[currentWave]@.
For test, put this loop in setup(),
for (byte i = 0; i < 255; i ++)
{
Serial.print(pgm_read_byte(&sineWave[i]));
Serial.print("\t");
Serial.print(pgm_read_byte(sineWave + i));
Serial.print("\t");
Serial.print(pgm_read_byte(&spinWave[i]));
Serial.print("\t");
Serial.print(pgm_read_byte(spinWave + i));
Serial.print("\t");
Serial.print(pgm_read_byte(waveTable[1] + i));
Serial.print("\t");
Serial.println(pgm_read_byte(&waveTable[1][i]));
}