Если подытожить её содержимое, история началась со времён ALGOL, FORTRAN и LISP, где всегда различали инициализацию и разрушающее присваивание. Уже в фортране использовался один и тот же символ = для обеих этих операций. Однако, алгол для присваивания использовал комбинацию символов :=, и, пока пытались написать реализацию (в смысле, реально существующий компилятор) алгола или хотя бы какого-то языка, подобного ему, двоеточие выкинули ради краткости.
Прямая цитата из первого издания The C Programming Language:
Since assignment is about twice as frequent as equality testing in typical programs, it’s appropriate that the operator be half as long.
"Так как [разрушающее] присваивание встречается примерно вдвое чаще, чем проверка на равенство в типичных программах, вполне уместно, что оператор будет вдвое короче", конец цитаты.
Вышеуказанная цитата это исторически точный ответ на вторую половину вашего вопроса.
Более точным символом для операции разрушающего присваивания была бы стрелка влево,
<-. Именно
так и решили авторы Haskell, например, где различие между чистыми функциями и функциями с побочными эффектами встроено в синтаксис языка.