RISOLTO mannaggiammè!
Beh, ovviamente il problema non stava nel chip a base silicio, ma nella macchina umanoide a base carbonio 
Sarò prolisso, ma come errore da principiante non è niente male e può servire ad altri.
Anche se io avrei dovuto evitarlo 
Nella funzione di set della data, per scrivere direttamente corretto il DoW, avevo trasportato questa procedura (Sakamoto's method) quando l'array ValoriIniziali (che conserva i valori in fase di modifica) era ancora int, quindi con range da interi.
Ed è cominciato tutto quando ho iniziato a passare variabili ed array da int a byte
Questo è il codice che ricalcola il DoW quando viene impostata la data per l'RTC; vari pezzi coinvolti:
int DOW2RTCConv[] = {7, 1, 2, 3, 4, 5, 6};
int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
int y=ValoriIniziali[0]; // --- (*)
y -= ValoriIniziali[1] < 3;
dw = (y + int(y/4) - int(y/100) + int(y/400) + t[ValoriIniziali[1]-1] + ValoriIniziali[2]) % 7;
...
dw = decToBcd(DOW2RTCConv[dw]);
...
Wire.write(dw); //4° byte GIORNO della settimana da 0x01 a 0x07
...
...
// Conversione normali numeri decimali in binario decimale
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
Sulla riga con (*) torno subito, il problema stava tutto li.
ValoriIniziali[] ha questa struttura:
byte ValoriIniziali[] = {18, 02, 15, 21, 44, 0}; // --- A Runtime dall'RTC - Anno-Secondi (no dow)
e come da commento viene aggiornata ogni volta che viene letto l'RTC (ogni secondo).
Però finché era int ad ogni lettura dell'anno (RTC1307 fornisce 00-99) veniva incrementata subito di 2000, mentre quando l'ho passata a byte l'incremento l'ho tolto ed aggiungo alternativamente la stringa "20" o il valore 2000 a seconda che sto scrivendo il display o modificando l'anno.
E dato che ValoriIniziali[0] era già "2000+qualcosa" lo riprendevo pari pari nell'istruzione (*)
Ha funzionato tutto bene, anche dopo aver cambiato nel codice gli int in byte, perché il valore letto dall'RTC e le varie vislualizzazioni erano coerenti
Finché (dopo aver cambiato int a byte) ho dovuto appunto aggiungere 2000 al valore visualizzato sul display durante la modifica anno e non ho riscritto per la prima volta l'RTC.
L'RTC prendeva il giusto valore (00-99) e continuava a lavorare con il giusto valore per l'anno, ma nel calcolo del DoW (che va scritto o verrebbe aggiornato/corretto solo a mezzanotte) mi ero dimenticato di aggiungere 2000 in quella riga, quindi veniva calcolato e scritto male, e io non mi ritrovavo più con gli indici dell'array

Quel pezzo di codice, quindi, diventa corretto in questo modo:
int DOW2RTCConv[] = {7, 1, 2, 3, 4, 5, 6};
int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
int y=ValoriIniziali[0]+2000; // --- (***)
y -= ValoriIniziali[1] < 3; // --- Anno è byte devo aggiungere 2000 (*)
dw = (y + int(y/4) - int(y/100) + int(y/400) + t[ValoriIniziali[1]-1] + ValoriIniziali[2]) % 7;
...
dw = decToBcd(DOW2RTCConv[dw]);
...
Wire.write(dw); //4° byte GIORNO della settimana da 0x01 a 0x07
...
...
// Conversione normali numeri decimali in binario decimale
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
e ovviamente l'array dei giorni DEVE essere
const char* Giorni[] = {"", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab", "Dom"};
Prima di postare ho fatto varie prove sia di setting data che verifica anche simulando il passaggio dalla mezzanotte, ed ora funziona correttamente e l'array va popolato come sapevo essere corretto.
Grazie a tutti per l'aiuto, fra poco quoto un'ultima cosa da una delle risposte perché mi è nuova.
Morale della favola: quando tocchi una variabile controlla sempre millemila volte dove e come la usi, pure se scrivi codice da tanti anni 