AppImage is a more localized approach to Flatpak's "bundle everything" in that instead of trying to have shared libraries across different applications (Flatpak tries to share runtimes), every set of dependencies is local to the application itself. In a way it is kinda like trying to static link everything, though of course it doesn't technically use static linking - and it is really up to the developer what "everything" means (it can still rely on stuff on the underlying OS). Also it only tries to solve the dependency problem, whereas Flatpak tries to do a bunch of other stuff.
From a "how things should be" perspective, both are bad IMO (see my other messages here), but from a purely practical perspective based on my experience with trying to use applications using them, AppImage tends to work slightly better and since it is local only to the application, it doesn't pollute the rest of the system.
If i had to choose, i'd choose none of them, but if i had to choose between the two then AppImage is by far the most preferable.