Hi @Anonymous
I am just running some tests. At the most basic the Copy Folder action DOES work with Document Sets, so the problem is not there.

Then, I enabled Content Approval on the Source Document Library and tried again. It still worked.
I created a pending and rejected document set.
Then I updated my Flow to more closely match yours and see what outputs I get from the Get Files Action using Compose actions.

I see that I can filter on
"{ContentType}": {
"@odata.type": "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedContentType",
"Id": "0x0120D5200093E450682F0ED645AA65B60DE0CDD165",
"Name": "Document Set"
},
"{ContentType}#Id": "0x0120D5200093E450682F0ED645AA65B60DE0CDD165"

This now returns me JUST my Document sets and not the documents within them.
The REAL hard bit now is that we can't actually get access to the Content Approval status in Flow. It should be a field called _ModerationStatus. So the only two ways around it are another Approved Column on the Source list that someone completes manually... which makes the Content Approval redundant or we use a Send HTTP to SharePoint which is not very Power User Friendly, but looks like this:

Now we can perform a condition on the returned values here (0=Approved) and do our Copy Folder action passing in the Dynamic Elements for Folder Path and Name (the folder name)

And it works!
I hope that helps and I hope you can understand the Send HTTP to SharePoint and Parse JSON. If not, let me know and we can try to extend on those bits.
- Mark