On the face of it this looks like a pretty simple Overlay problem that could be solved with Union. But the devil is in the details and it's going to take a little extra statistics work to end up with the desired result. I would start by adding a Basin Total Area field to your drainage layer and field calculating that. You're going to need the totals to get percentages later, and having it as a static attribute to calculate on would be helpful.
I'm going to assume your surface geologies don't overlap, just the basins. The simplest form would be to split your basins into two (or more - how many sub-catchement levels are there?) files so you don't have any overlap, but that isn't required. It may take a little experimentation with QGIS's Union tool to make sure you're getting the correct results and following the attribute table changes, and this can be done in one or two steps. If you union basins to itself, you should eliminate overlaps while keeping attributes of both. If you union basins and geologies, the same will happen but I'm not sure exactly how it's going to handle stacked geometries in one layer combined with a 'third' geometry from another.
What you should end up with when all unioning is said and done is a set of non-overlapping polygons that has all the attributes from every parent polygon. This is where you need to be careful and do a data check though. I note from the image that coverage doesn't match. This means that there are slivers of basins that have no geologic data because the boundaries don't quite line up. That means you're going to have a percent category of 'unknown' in your final table. This is also why you can't use Intersect (as that only keeps areas common to both layers). And speaking of slivers, since the boundaries don't match you may end up with a lot of polygons resulting from union if there are boundaries that cross back and forth a lot. This could cause a performance impact and is one reason why simplifying overlaps up front may help.
From there you have to add a percent attribute field and then use field calculator to divide whatever the polygon's area is by the earlier basin totals you came up with (note that may be more than one total). Then you'll need to flatten that down to a summary table, since you may have disconnected areas of the same geology in the same basin. I think the Group Stats plugin might be of assistance there, if not exporting the attribute table to Excel or something to work with it there.
Unfortunately I don't know the QGIS specific tools that well, as I'm used to working in ArcGIS (where I'd be using Identity and Summary Statistics for this problem rather than Union, though Union would still be an option). I can add more detail about an ArcGIS solution if you have that available.