As far as I know, the permissions are always required for birthday. Not sure about bio offhand honestly.
I just re-looked at your code and would highly recommend updating it a bit to use JFBConnect more. You're re-instantiating the Facebook library (which is slower) and avoiding a lot of great functionality in JFBConnect. If you're up for a minor update of your code, I'd recommend changing it to the following:
$profileLibrary = JFBConnectProfileLibrary::getInstance();
$jfbcLibrary = JFBConnectFacebookLibrary::getInstance();
$fbUserId = $jfbcLibrary->getFbUserId(); // This is the current user logged in through Facebook
$fbUser = $profileLibrary->fetchProfile($fbUserId, array('bio', 'locale', 'birthday'));
$bio = $fbUser->get('bio', ''); // default of 'blank' in case nothing is returned
$locale = $fbUser->get('locale', 'en_GB'); // default of 'en_GB'
...
That will use JFBConnect to fetch the information. The benefits are that you have error checking, a lot of checks in the code, and you can easily set a default in case nothing comes back. It also will use the user's current authentication token, which should have the permissions they granted on login.
Hope that all helps, but if not, let me know!
Thanks,
Alex