From,
External Storage Technical Information | Android Developers
"The default platform implementation of this feature leverages Linux kernel namespaces to create isolated mount tables for each Zygote-forked process, and then uses bind mounts to offer the correct user-specific primary external storage into that private namespace.
At boot, the system mounts a single emulated external storage FUSE daemon at EMULATED_STORAGE_SOURCE, which is hidden from apps. After the Zygote forks, it bind mounts the appropriate user-specific subdirectory from under the FUSE daemon to EMULATED_STORAGE_TARGET so that external storage paths resolve correctly for the app. Because an app lacks accessible mount points for other users' storage, they can only access storage for the user it was started as.
This implementation also uses the shared subtree kernel feature to propagate mount events from the default root namespace into app namespaces, which ensures that features like ASEC containers and OBB mounting continue working correctly. It does this by mounting the rootfs as shared, and then remounting it as slave after each Zygote namespace is created."
It goes down to the kernel level. This process is forcing apps to check our internal storage for obb data. So, regardless of what's done to it, ex. folder mount, symlinks etc. the original target gets resolved back to emulatedstorage0 first, before anything else. And since it does this first, Gameloft games are just seeing the nonexistent obb data, before the symlink redirects it to the SD, which it then gets denied access to, because the app its self didn't make the "original" directory. (this whole process also doesn't play nice with the way cm11 is set up) Hence why folder mount works for most apps, but not all of them. Its also why adding the external write permission doesn't fix it for us. If someone can make the mount process grab our external storage as the primary storage, rather than the internal side, it should in theory, fix the issue. Then again, newer apps might break from this if the target version it was originally developed for is 4.2+ There's a petition in place for them to NOT implement these changes any longer in android with the release of android L. Devs are pretty pissed off about it. Hopefully they'll fix it. Sorry if it sounds confusing as hell, I have a very good idea of what's going on, I'm just not very good at putting things in human readable terms sometimes. Hopefully somebody understands what I'm trying to say.