Help with multiple tasks

@vader7071
1)
Please change the quote tags in the post to code tags. So we don't have to try to translate smilies and we don't have to read italics.
2)
Please post complete code. If it's too big, either attach or split over two or more posts.

And for the problem, I think that you need to get rid of delay completely.

PS
Re-reading your post, I think that you already figured that out. In which case you should get rid of the outer for loop in your scroll function.

void scroll(char* text)
{
  static int scrollPositions = 0;

  // when starting a new scroll, get the length
  if(scrollPositions == 0)
  {
    scrollPositions = (strlen(text) * 8) - 32;
  }

  static int scrollCount = 8 * NUM_MATRICES;
  static unsigned long scrollStart;

  // if it's time
  if (scrollStart - millis() >= msgInterval)
  {
    // scroll one position
    for (uint8_t m = 0; m < NUM_MATRICES; m++)
    {
      matrix[m].clear();
      matrix[m].setCursor((x - (m * 8)), 0);
      matrix[m].print(text);
      matrix[m].writeDisplay();
    }
    // restart timing
    scrollStart = millis();
    // one move completed
    scrollCount--;
  }
  // if scroll completed
  if (scrollCount == 0)
  {
    // reset for next scroll
    scrollPositions = 0;
  }

}

Not compiled but it should give you the idea.