Проблема с return?
Используйте «промисы».https://learn.javascript.ru/promisecaniuse.com/#feat=promiseshttps://github.com/dfilatov/vow, и т.д.
Или jQuery.Deferred:function getLang(lang) {
    var d = $.Deferred();

    $.getJSON(gInit['url'] + '/lang/'+getCookie('lang')+'.json', function(data) {
        var items = [];
        $.each(data, function(key, val) {
            if(key == lang) {
                items.push(val);
            }
        });
        d.resolve(items);
    });
 
    return d.promise();
}

var test = getLang("users");
test.done(function (data) {
     console.log(data);
});
Проблема в том что вы не до конца понимаете как работают callback функции и асинхронные вызовы.
При вызове из консоли getLang("users") вообще никаких return не срабатывает. Вызывается функция $.getJSON и все, функция getLang завершает свою работу.
Параллельно с этим выполняется запрос gInit['url'] + '/lang/'+getCookie('lang')+'.json' (он может выполняться, например, несколько секунд) и по его завершению срабатывает ваш код, вплоть до return, однако возвращать значение уже некому.
Замените return на alert или console.log и вы сами все поймете.