Linux is a multi-user, multi-tasking operating system. This means that it can run multiple processes simultaneously. However, this is an illusion. What is really happening is that only one program runs at a time (assuming we have only 1 CPU ...). The apparent execution of multiple programs at the same time occurs because we perform what is known as a context switch between programs very quickly. If we were to take a photo snapshot at any moment in time, only one program would ever be running in that picture but if we switch between programs quite quickly, we get the illusion that they are all running. So ... what allows us to switch between one program and another. Typically, a program will "relinquish" its use of the CPU when it performs some kind of long term asynchronous I/O operation such as writing to disk, making a network call or waiting for user input. However, if a program performs lots and lots of pure CPU operations, it may never voluntarily give up its CPU time. This is where pre-emption comes into play. The OS tracks how long a given application has the CPU and if it has held that CPU for "too long", the CPU is taken from it and given to another waiting application. There are sophisticated algorithms for choosing which application gets the CPU when a slice of time is used up and this is, in part, governed by an attribute of a process called its priority. At a high level, processes which want the CPU and have a higher priority level than other processes will be given it. What this means is that if a program runs with high priority, it may be given an "unequal" share of the CPU relative to other processes. This can result in the notion of "starvation" of other applications which would like the CPU but have lower priorities.
There are also other reasons that starvation can occur. There are certain tasks that are "non-interruptable" and if called, may not be preempted. An application that registers to use these services may also claim an unequal share of resources.
The starvation of CPU time to some applications does not indicate an error or flaw ... it merely reflects the reality of what the system may actually be doing. When an application is run as root, that application has the highest level of privileges which includes the ability to change its own priority (upwards) as well as register with the hardware timers for interrupt level processing at very short duration intervals.
I did a very quick examination of the code in the projects you referenced and found indications that both of these may be happening in the Adafruit libraries. It may simply be the case that when you are running those Adafruit programs, they actually need dedicated resources to achieve the timliness of the tasks that they are performing and that there is nothing left over to give CPU cycles to the other applications you want to run in parallel.