Потому что ты объявил в области видимости функции Б новую переменную А:
function a() {} /* = */ var a = function() {}
Да, ты её обновил после присвоения А нового значения, и даже после ретурна, НО прежде, чем выполнять код, интерпритатор проходится по коду и (не помню правильной формулировки) определяет области видимости и переменные, которые в ней находятся.
То есть на момент выполнения кода, в функции Б присутствует своя переменная А, а если убрать объявление переменной в функции, то будет взята переменная из области видимости выше.
Как-то так.