Ci sono diversi approcci, quello indicato da pgiagno è il più generale con cui affronti qualsiasi problema che richieda diverse fasi di funzionamento (o diversi processi in "parallelo").
In un caso come questo si può anche ragionare a livello più basso, abbiamo una tabella:
s1 s2 | l1 l2
-----------------
0 0 | 0 0
1 0 | 0 blk
1 1 | 1 0
da cui si vede che il LED1 è comandato semplicemente dall'and di s1 e s2:
digitalWrite(PIN_LED1, s1 && s2);
e abbiamo una condizione di lampeggio:
cond = s1 & !s2;
dopo di che serve un blinker comandato da questa condizione. Se è falsa uscita blinker 0 e blinker disattivo:
if (!cond) { q = 0; act = 0; }
se vera possiamo essere alla prima attivazione, e quindi impostiamo uscita 'q' alta, blinker attivo, e ci salviamo il tempo di sistema per la temporizzazione:
else if (!act) { q = 1; act = 1; t = millis(); }
oppure possiamo essere già in conteggio, e allora ad ogni timeout invertiamo l'uscita (e "ricarichiamo il tempo di sistema):
else if (millis()-t >= 500) { q ^= 1; t = millis(); }
Il blinker si comporta quindi in questo modo:

non resta che comandare il LED2 con l'uscita del blinker:
digitalWrite(PIN_LED2, q);