Hast Du Dir das Beispiel http://arduino.cc/en/Tutorial/BlinkWithoutDelay eigentlich mal angesehen? Wenn man den Code in entsprechende funktionale Blöcke teilt, die jeweils einen Status haben, ob sie aktiv sind und jeweils ihren eigenen "delay ohne delay" millis-Wert verwalten, wird es vermutlich sogar übersichtlicher.
Natürlich kann man nicht einfach dealy(xxx) durch einen BlinkWithoutDelay Vergleich ersetzen, der Code muss dafür schon umstrukturiert werden. Aber es geht ja am Ende darum, das nicht ein Block durch das delay alle anderen blockiert.