Проблема 1: результат читается обратным вызовом, но это копия, поэтому не может быть записана так, как вы думаете.(локально записываемый не глобально, эту подзадачу можно было бы «исправить», сделав ее глобальной переменной, но это все равно не заставило бы ваш код работать)
Проблема 2: FB.api, скорее всего, вызывает этот обратный вызовв будущем асинхронно, позволяя check_perm немедленно возвращаться с результатом, в каком бы состоянии оно в настоящее время не находилось (undefined)
Вам нужно поместить код, который имеет дело с фактическим ответом, в эту функцию обратного вызова, которая будет выполняться, когда ответ станет доступен,Вам даже не понадобится переменная результата в этой точке.