ESP32 - LVGL - comportamento strano con style

No, non è cosi;
Stai passando le variabili nel modo corretto poiché hai definito labels come un array di puntatori lv_obj_t che è esattamente ciò che si aspetta la funzione.

lv_obj_t* labels[4]; // Array globale

Il dubbio a questo punto è proprio sulla modalità con cui applichi gli stili ai widget LVGL.

Come prima cosa, usi 0 come selettore nella seconda chiamata: LV_PART_MAIN è definita come 0x0000 quindi in teoria non dovrebbe cambiare nulla, però il framework LVGL fa molto uso di macro che magari hanno problemi in questo modo.
Prova ad usare LV_PART_MAIN in modo esplicito anche nel secondo caso.

Inoltre tu continui ad aggiungere lo stile allo stesso widget anche se magari è stato già assegnato, non dovrebbe essere un problema però nel dubbio prima di assegnare il nuovo stile al widget, prova a rimuovere tutti quelli assegnati in precedenza per evitare sovrapposizioni usando la funzione lv_obj_remove_style_all()

dtostrf(lastPayload.time/1000.0, 0, 3, indata);
lv_obj_remove_style_all();
lv_obj_add_style(labels[lastPayload.msg], colori[1], LV_PART_MAIN );
lv_label_set_text(labels[lastPayload.msg], indata);

Infine, siamo sicuri che sia proprio l'istruzione lv_obj_add_style() a creare problemi e che invece non sia l'array di caratteri char indata[] a contenere dati "strani"?
Aggiungi un Serial.println(indata) di verifica.

Inoltre, LVGL dispone della funzione lv_label_set_text_fmt() che ti consente di formattare il testo direttamente senza usare dei buffer temporanei e l'istruzione dtostrf()

if(lastPayload.delta) {  // è un delta
    lv_label_set_text_fmt(ui_delta, "%.3f", lastPayload.time/1000.0);
    lv_obj_remove_style_all(ui_delta);
    lv_obj_add_style(ui_delta, &style_purple, LV_PART_MAIN);
}
else {  // è un time
    lv_label_set_text_fmt(labels[lastPayload.msg], "%.3f", lastPayload.time/1000.0);
    lv_obj_remove_style_all(labels[lastPayload.msg]);
    lv_obj_add_style(labels[lastPayload.msg], colori[1], LV_PART_MAIN);
}