immagino che queio tempi siano scritti da qualche parte, non vadano sempre e siano moltopiù piccoli, ma io opereri così:
dividerei la parte di codice che rileva l'urto, e quello che salva su SD/invia l'SMS
la parte di urto gira e fa un check completo ogni loop(), se avviene un urto salva in una variuabile il tempo in cui è avvenuto (ed altre info che ti saranno utili, e settauna flag "nuovo urto"
poi a fine loop() chiami una funzione che:
se è stato rilevato un nuovo urto, o era un esecuzione un salvataggio, allora: ogni loop esegue UNA istruzione SD o SMS (intesa come una serie di istruzioni fino al delay), semplicemente poi incrementa la variabile di "stato_salvataggio" che gli farà fare al prossimo loop l'operazione successiva.
In questo modo il salvataggio + SMS NON blocca il codice urto, PERO' se tieni i delay alti (non esegui un istruzione SD+SMS ogni loop, ma ogni tot loop per assicurarti che passi ababstanza tempo) è possibile che più urti si "sovrappongano". A te la decisione di come gestire, puoi creare una coda di TOT urti (limitata, se no sfori la ram e si impalla tutto), oppure (soluzione che cosniglio per semplicità) ignori gli urti "di mezzo", o magari li conti e mandi un alert che li racchiude.
che io sappia la SD può scrivere a piena velocità arduino, quindi mi sembra moolto strano che si impalli senza delay.