1. Use mounting hole components. Single pin symbol, hole footprint. Connect to net. This way it's obvious and explicit on the schematic: your holes are not insulated and floating, they have this connection.
2. Free pads can be assigned nets in Properties, or in netlist editor (D, N, N). (You've probably done this already.)
3. Free pads can be queried by the name 'Free-' + <pad name>. Your holes would seem to be 'Free-0'.
4. Under Polygon Connect rules (D, R), add a rule, with elevated priority, to connect direct (no relief), with first object query: "IsPad AND (Name = 'Free-0')". You can further query the second object (polygon) if you would like special cases. Polygons can be named for instance, and queried with IsNamedPolygon(name).
5. You may be able to construct more complex queries with right-click object, Find Similar Objects... Tick "create expression" to show how it's done it.
6. This should be helpful:
https://techdocs.altium.com/node/300788As you gain experience with it, I think you will find queries are very useful indeed.
The biggest limitation is no support for relational logic: you can only query single objects. For example, you cannot query a component that has pin(s) in a given net. That particular operation can be reconstructed by querying the pads ("IsPad AND NOT IsFree AND InNet('MyNet')"), then going to Properties and following the hyperlink to Component/Owner.
The biggest frustration, is every, single, fucking, property, has
three different names. There is the text label in Properties (e.g., pad "X Size (All Layers)"), which is also the label used in the List Panel; there is the query name ("PadXSize_AllLayers"), and there is the name that can be used in assignment expressions on that object (??). I haven't found a list of the latter labels. (A property can always be self-referenced with "!". Example: to move a selection of objects 50 mils to the right, enter: "! + 50mils" in X1.)
Tim