Насколько мне известно, если мы можем назначить
Это не обязательно верно в случае типов классов. Но это всегда верно для указателей, которые вы используете в примере.
Тогда почему в учебнике говорится адрес возврата rvalue
Ну, вы не можете присвоить ему:
&a = &c; // ill formed because &a is rvalue
int *x = &a; // OK. Not an assignment
x = &c; // OK because x is lvalue