может, дело в контексте. но тут с рекурсией всё в порядке
пример похож на ваш.
var result = [];
function b(a, c){
/*что-то делаем*/
result.push(a);
c();// callback
}
function rec(a) {
if( a.length != 0 ) {
b( a.shift(), function(){ rec(a) } );
} else {
return result;
}
}
rec( [ "a","b","c" ] );
alert( result.join("\n") );