How to get sharp edges with subsurf and concave Ngons
I also struggle with this. I have two tricks that might help:

You can make the corner of a hole sharp by creasing an additional one of its connected edges:



But if your surface is curved, this might create an ugly sharp discontinuity.

So instead you might try the crease options on the solidify modifier:


Again, it can get weird when the surface is curved, but I find it helpful in most situations. If you don't want your surface to be made solid, you can set the modifier to only generate a rim, and make the rim vanishingly small.

Hope this is helpful. If you find anything useful, please share it!