It seems like virtually every function in the supplied Arduino libraries is blocking. And writing linear code that blocks every step of the way seems to be the promoted "Arduino Style". Frankly it works great for people who have simple tasks to perform and are not educated as programmers.
I've written two books programming Arduinos, and am working on a third, and a key goal has been to avoid blocking functions. The new book starts out with a game program project implemented in five different ways:
Linear, everything happens in a loop, most every function blocks. When a second task is added all hell breaks loose.
State Machine. 11 states, IMHO much easier to follow but not linear. A second state machine handles the second task.
Callback functions -- state machines don't even run unless triggered by an external event.
Interrupt Driven -- state machines runs from an ISR. The loop() function is empty.
Real Time Operating System -- game implemented under FreeRTOS. Potentially the easiest approach but requires drivers in the library to yield the processor when they block.
What Arduino functions blocK? Well here are some: analogRead, pulseIn, shiftIn, delay, many Stream and Serial functions, especially if used carelessly, SPI, SoftwareSerial, and many more. Almost all of these could have non-blocking alternatives.
Look at the innocent appearing analogRead. When you call it, you have to wait for the ADC to perform a conversion, which takes 112µs. If instead the command started a read and then you could check for a result later, or have a callback function get called upon completion, then other tasks could be performed at the same time.