Basta cambiare l'ordine con cui fai i conti, trattandosi di unsigned int (quindi numeri che non diventano MAI negativi) il risultato della sottrazione sarà sempre coerente e valido.
P.S.
Le variabili stato_sensore , stato_pulsante e stato_rele sono ridondanti, puoi anche usare direttamente digitalRead() e digitalWrite.
P.P.S.
Attenzione all'ingresso definito come INPUT: assicurati che il segnale sia a "pull-down" con una resistenza visto che lo vai a testare sul livello HIGH, oppure abilita le resistenze di pull-up interne del micro e vai a fare l'if sul livello == LOW
int sensore_suono = 4;
int rele = 6;
int stato_sensore = 0;
int pulsante = 8;
int stato_pulsante = 0;
int stato_rele = 0;
unsigned long tempo_accensione_rele = 0;
void setup() {
pinMode (sensore_suono, INPUT);
pinMode (rele, OUTPUT);
pinMode (pulsante, INPUT);
}
void loop() {
stato_sensore = digitalRead (sensore_suono);
stato_pulsante = digitalRead (pulsante);
stato_rele = digitalRead (rele);
//sezione sensore suono--------------------
if (stato_sensore == LOW) {
digitalWrite (rele, HIGH);
tempo_accensione_rele = millis();
}
else {
if (millis() - tempo_accensione_rele > 5000) {
digitalWrite(rele, LOW);
}
}
// sezione pulsante------------------------
if (stato_pulsante == LOW) {
digitalWrite (rele, HIGH);
tempo_accensione_rele = millis();
}
else {
if (millis() - tempo_accensione_rele > 5000) {
digitalWrite(rele, LOW);
}
}
}