Those traits exist for efficiency reasons. If you couldn’t overload the something-assign operators, it would mean, for example, that a matrix addition would have to allocate a huge temporary matrix, just to then have it copied into the LHS. These traits are not provided so that arbitrary trickery can be done in overloaded operators (this is/should be true for all overloaded operators in general, not only compound assignments).
In other words, using += to add two values then in addition do some of the trickery that you describe is frowned upon (and for the good reasons I’ve already explained). Basically, the ability to overload these particular operators is a necessary bad for performance-critical code, however it can and should be used in an unsurprising way if treated cautiously.
Basically, the expectation/implicit contract of these traits is that they will do the semantic equivalent of whatever the corresponding non-assignment operator does, followed by a simple assignment, and nothing else.
The plain = operator, however, can’t possibly be used in this manner. It has one and only one purpose: moving/copying the RHS into the LHS. This can’t be done any more efficiently than the compiler already generates, hence it’s useless to overload for performance reasons. And it’s actively harmful to overload for any other reason, because any other, non-trivial implementation thereof would be surprising, as I explained earlier. So, basically, what I’m saying is the only expected/non-abusive overload of it would perform exactly the same action as it already does today.
I can image some different syntax which calls getters and setters, because then the distinction would be very clear, which is good. However, at that point I don’t really see value in it either, because in that case you could just use a setter function and a plain old function call, and we are back at square 1.