Integro con un pezzettino di codice, cio che bisogna cambiare (se il problema è quello che penso io) è il foreach:

codice:
    foreach(User vmu in users)
    {
        User user = db.User.Find(vmu.ID); //Pesco il vero user attraverso l'id dell'user "contenitore"
        if (null == user)
            throw InvalidOperationException(); // L'user nel frattempo è sparito sicuramente c'è stato un errore di concorrenza e tutta l'operazione dovrebbe essere anullata. Potresti gestirla anche in modo piu pulito questa cosa per esempio aggiungendo un errore al modelstate.

        user.Nome = vmu.Nome;
        user.Cognome = vmu.Cognome;
        //e cosi via per tute le proprietà da modificare...
 
        db.Entry(user).State = EntityState.Modified;
    }

    db.SaveChanges();