I don't think there is any better way than looping through each cell in src. The Excel.Application object has the Intersect function, which tells you what cells are contained in two or more ranges, but not the opposite. You can also perform a union which just gives you a range with all the cells in two or more ranges...
But I think you're going to have to go through each cell in src and see if it's in sel...
Function GetInvisibleCells() As Range
Dim src As Range, sel As Range
Set src = ActiveSheet.UsedRange
Set sel = src.SpecialCells(xlCellTypeVisible)
Dim Isection As Range
Set Isection = Application.Intersect(src, sel)
Dim Result As Range
Dim cl As Range
For Each cl In src ' Go find all the cells in range2 that aren't in Isection
If Application.Intersect(cl, Isection) Is Nothing Then
' Cl is not in sel
If Not Result Is Nothing Then
Set Result = Range(Result, cl)
Else
Set Result = cl
End If
' Debug.Print Cl.Address & " is in " & src.Address & " and not in " & sel.Address
End If
Next cl
Application.Intersect
Set GetInvisibleCells = Result
End Function
There are a few approaches detailed here