The problem with using the FastLed library with an APA102 LED strip is that the libiary was designed initially for the WS2812 strips and they require precise timing to work. Therefor the interrupts are turned off during the data transfer from Arduino to strip.
Serial inputs require the interrupts to be on in order to work, therefore you will miss messages.
However the APA102 LED strip does not need precise timing as it has a clock and data line, so the transfer could happen with the interrupts still enabled. This means if you write your own bit banging transfer function you will not miss MIDI messages.
As an experiment, I tried putting a conditional around the show function:
if (!MIDI.read()) { FastLED.show(); }
It is a bit crude and results in a lot unnecessary callings of the show method. Use a Boolean variable to control this. Set it when ever you get a positive result from a MIDI read, and include that variable in the test for calling the show method, and then clear that variable directly after you call show.
if (!MIDI.read() && ! shown) { FastLED.show(); shown = true}