Since the area in question is the southern portion of Lake Nipigon, I downloaded the Lake Nipigon polygon from Ontario Hydro Network (OHN) - Waterbody | Ontario GeoHub.
The results from using Generate Points Along Lines (Data Management) - ArcGIS Pro | Documentation with a distance of 40 km are:

Given the winding nature of the shoreline, 40 km of perimeter traversal results in points that are not 40 km apart when measuring Euclidean/straigh-line distance. Although expected, this isn't the desired outcome.
Given there are several factors that already introduce some arbitrariness to the point locations, e.g., choosing a distance between points and a starting point, going with an approximate solution will be quicker and easier than an exact solution.
As much as brute-force approaches aren't elegant, sometimes they are quick enough to get the job done. Below is a brute-force approach that iterates around a densified perimeter to the lake looking for the first point that is within a tolerance of 40 km of the last selected point. The code is written to only process the first polygon in in_fc
, but it could be adapted to work on all polygons.
import arcpy
from arcpy.management import CopyFeatures, GeodeticDensify
in_fc = # path to feature class or name of feature layer
out_fc = # path to output feature class containing Euclidean-equidistant points
den_fc = GeodeticDensify(in_fc, "memory/den_fc", "GEODESIC", "500 meters")
shp, = next(arcpy.da.SearchCursor(den_fc, "SHAPE@"))
point_geoms = []
parts_iter = iter(shp.getPart(0))
point = next(parts_iter)
prev_ptg = arcpy.FromWKT(f"POINT({point.X} {point.Y})", shp.spatialReference)
point_geoms.append(prev_ptg)
for point in parts_iter:
ptg = arcpy.FromWKT(f"POINT({point.X} {point.Y})", shp.spatialReference)
if ptg.angleAndDistanceTo(prev_ptg)[1] < 39750: continue
prev_ptg = ptg
point_geoms.append(prev_ptg)
CopyFeatures(point_geoms, out_fc)
The results from the code, rounded to the nearest km, are:

The code ran in around 15 seconds on my laptop. A vast majority of that time is spent creating PointGeometry - ArcGIS Pro | Documentation objects from the Point - ArcGIS Pro | Documentation objects returned by Polygon.getPart()
; however, taking this approach allows both geographic and projected datasets to be processes by the same code.