Once you activate a servo on a pin with servo.attach(pin), the servo ISR continues pulsing that pin even when you aren't moving the servo. If you stop it, one of four things may happen, depending on the servo - it may stay where it is, or power down, or drive to a preset 'safe' position, or drive to either limit. Unless you know what the servo is specified to do on loss of signal, and that's power down or hold position, it isn't safe to use servo.detach().
Most Arduinos will use Timer 1 for the servo library (see ServoTimers.h in the library for exceptions).
In Servo.cpp:
#define usToTicks(_us) (( clockCyclesPerMicrosecond()* _us) / 8) // converts microseconds to tick (assumes prescale of 8) // 12 Aug 2009
defines the relationship between timer ticks and us.
In Servo.h:
#define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo
#define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo
#define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached
#define REFRESH_INTERVAL 20000 // minumim time to refresh servos in microseconds
gives the limits for one servo pulse, and the total frame length.
The servo library outputs pulses to its active channels consecutively during the servo frame. Therefore if you are controlling three servos, there's a gap between approx 7.2ms and 20ms in the servo frame where you can be certain no servo pulses are being output. That's when you need to update the neopixel string(s).
As usToTicks() is private in the Servo lib, you need a copy of its definition in your sketch, then you can simply do
while(TCNT1<=usToTicks(8192)){};
pixels.show();
which waits for the gap in the servo frame before updating the neopixels. For 16 RGBW neopixels, show() has 512 bits of data to send, which will take approx 0.7us @800KHz pixel clock.
N.B. you can daisy-chain the neopixel strips by connecting DIN to DOUT, so you'll only need one I/O and one call to the show() method for all the neopixels.