Ну смотри, ты делаешь dto для update в которой все поля будут с декоратором
@IsOptional() - в контролере сразу делаем проверку Object.keys(myUpdateDtoFromRequestBody).length и если будет false (послали пустой запрос), говорим пользователю что нужно хоть одно поле отправить для обновления. Потом этот самый myUpdateDtoFromRequestBody отдаем в сервис для обновления, не нужно его мапить руками - просто передай this.model.updateOne({_id: todo._id}, myUpdateDtoFromRequestBody) и все.
Таким образом у тебя будут обновляться только те поля которые пользователь отправил с фронта.