Не понимаю, за что людям нравится print_r.
Фокус поясняет куда более понятный var_dump.
После первого цикла:
array(4) {
[0]=>
int(2)
[1]=>
int(4)
[2]=>
int(6)
[3]=>
&int(8)
}
Последний элемент массива - ссылка на значение. Очевидно, что это осталась висеть ссылка на $value. Вообще-то, именно в массиве ссылка на переменную осталась, а не наоборот.
Теперь пошли по второму циклу: на каждой итерации присваиваем переменной $value значение массива. Это рядовой оператор присваивания, меняет значение переменной. Допустимое поведение переменной, ссылка из массива от этого не разрывается.
Мы на каждой итерации меняем значение по ссылке последнего элемента, оно и меняется. Всё верно. Ну и откуда бы нам теперь достать 8? Нет больше никакого 8.
На последней итерации интерпретатор при обращении к элементу массива-ссылке получает из переменной $value и затем присваивает его переменной $value. Операция бессмысленная, но допустимая и значение не изменяется, так же как и связь ссылки со значением не разрывается.
Глубже смотреть - это надо углубляться в zval и refcount модель управления памятью PHP.