As a possible starting point, you could use Geometry Generator (under the Placement tab for Labels) to move the labels outside the polygon. The following expression will generate a point on the boundary of your polygon (in my case, 'Country'), buffered by a certain amount (in my case, 0.2 degrees) to force it outside. The aggregate and convex hull are to cater for issues with multi-polygons - may not be required in all cases:

Code:
closest_point(
aggregate(layer:='Country',
aggregate:='collect',
expression:=exterior_ring(convex_hull(buffer($geometry,0.2)))
),$geometry
)
You can then use a very similar expression in the Symbology, by adding a Geometry Generator to the original marker:

Code:
make_line(
closest_point(
aggregate(layer:='Country',
aggregate:='collect',
expression:=exterior_ring(convex_hull(buffer($geometry,0.2)))
),$geometry
),$geometry
)
This should be able to be extended to multiple point layers, per the original question.
Output on my single point layer looks like the following. Not a perfect solution, but might be a building block:
