The condition appIsLoaded() is in many places used as general wait until nothing is happening anymore in the background. Unfortunately its not so easy to test for that and appIsLoaded() is definitely not meant for that.
appIsLoaded() and appIsLoaded(String appName) are meant for evaluating if an app is correctly loaded meaning, the app-viewport is around, the tab has the correct name in case it is provided and that the preloader overlay is not there any more.
In case we are doing something inside the app, instead of using appIsLoaded() a specific condition should be used evaluating the expected status of the application. Or in case we waiting for a dialog to appear or disappear there are already generic conditions for that available: dialogIsOpen() and dialogIsClosed()
The reason why this worked in the past was a side effect: The old very generic implementation of appIsLoaded() tried to get the appPreLoader to validate it has appear before evaluating that it disappeared. Because the actions inside an app are quite fast, like adding a new folder in a tree, the pre loader already disappeared before appIsLoaded() was even called.
getElement(byAppPreLoader()) is now nothing else than delay(TIMEOUT) because the pre loader is already gone and getElement() tries to find the element with the given locator until it reaches the timeout and then returns null. Because in this case the result is not used the actual error was masked.