the short answer is because the id of the view in your ForEach is \.self (line 31). If you just write
ForEach($cars) { $car in
your code will work.
(with the code you posted) you can edit all the fields, but you won't see your changes in the detail view until you close the view by going Back, then opening a new CarDetailView.
the equality function is used to check if a structure has changed. If you make the equality function only dependent on the id, and have no means to change id, then when you edit your Car, the new struct is considered equal to the old struct value and your 'new' struct won't be saved to the cars array.
I have to admit I spent a lot of time today trying to understand why there's a difference between
ForEach($cars, id: \.self) { $car in
and
ForEach($cars) { $car in
but could not find a satisfactory explanation.
In fact, your code worked in the simulator for me, but not on a real phone, and not in Xcode's live preview. On the phone, it did accept edits, but the values propagated to the cars array were different, while in the live preview, I saw the behavior you described.
The id used in the ForEach needs to be stable - self keeps changing if you edit the fields.