As far as the loops. You can see the data is being sent to the MAX chips using the MAX library here:
lc.setRow(i, j, outputbyte);
So the outer loop i determines the display, it runs 0 to 5. (the comment says "loop through our 8 displays" this is wrong)
The center loop j determine which row we are on, it runs 0 to 7. The MAX library sets a row at a time with a bitmapped byte.
The inner loop k sets up that byte so it too runs from 0 to 7. It copies bits from the font map for the current character into the output byte that will be sent to the MAX chip. It also does work to determine when we have advanced past the current character using the font length array or have advanced past the end of the message itself.
Too bad the MAX chips can't be used as "dumb" shift registers. You could just send a new column of data and let the last one fall off the most significant end of the register. Instead you are sending the whole damn dataset every time you want to advance the display a column.