Perchè tieni differenziati i campi Data ed ORA che poi li riunisci spero sia dato da impistazioni non dipendenti da te...
Per l'ottimizzazione del codice
   Dim dtPrev  As Date
    Set RsTempi = DB.OpenRecordset("select * from tempi order by data DESC, ora DESC, stato")
    RsTempi.MoveFirst
    dtPrev = DateValue(RsTempi!Data) + TimeValue(RsTempi!Ora)   
    RsTempi.MoveNext
    ' calcolo tempi macchina
    Do Until RsTempi.EOF
        RsTempi.Edit
        RsTempi!Durata = dtPrev-(DateValue(RsTempi!Data) + TimeValue(RsTempi!Ora)) 
        RsTempi.Update
        dtPrev = DateValue(RsTempi!Data) + TimeValue(RsTempi!Ora)
        RsTempi.MoveNext
    Loop
    RsTempi.Close
    Set RsTempi=nothing
Per l'ipotesi di gestirlo ui nfase di Inserimento...
Su Evento AFTERINSERT del Record, puoi memorizzare il Valore Data/Ora, poi spostarti al Record Precedente, andare in EDIT inserendo il calcolo, e poi ritornare al Record inserito...
Private Sub Form_AfetInsert()
   ' Verifica che ci siano i Valori di Data/Ora, altrimenti Esci
    Dim dtPrev  As Date
    dtPrev = DateValue(Me!Data) + TimeValue(Me!Ora)   
    With Me.RecordsetClone
        .MovePRevious
        .Edit
        .Fields("Durata") = dtPrev - (DateValue(!Data) + TimeValue(!Ora)) 
        .Update
        .Bookmark=Me.Bookmark
    End With
 End Sub
Il Codice l'ho scritto a braccio senza testarlo, ma solo per farti comprendere il senso tecnico, ciò detto dovrebbe essere corretto.