Not sure whether the following approach will help you or not.
1. Get the edges of the cylindrical face and for each edge, find the adjacent flat face. This step is critical to find proper flat face.
2. Once you find the flat face, using the example below you can find all hole edges on that flat face.
3. If the edge or edges of the cylindrical face (found in step 1) is one of the edges found in step 2. Then selected face is part of a hole or vice versa.
Though, i think we will face issues in case of blind holes or counterbores etc. Not sure.
If you have a simple holes (which have planar faces at boundaries) than you can check the types of the loops at the boundary edges. In this case you can find if it is an external face (boss) or internal (hole), if the later one you can see if it is a blind hole or through all hole. Please see example here: Get Type Of Cylindrical Face
If you want more generic approach (i.e. if cylindrical face may have cutouts or might not have planar faces at the boundaries) you can find out if this is a hole or boss based on the directions of the normals. Here is the detailed example which explains this approach: Determine If The Selected Face Is Hole Or Boss
Thanks for the detailed explanation.