You're mixing two different things here that can't be mixed. Although it's completely understandable how you would make that mistake. In the picture below I've drawn three lines in a sketch. Only in one of the corners do the line lines geometrically connect at their ends. At one of the other two corners they overlap and at the other one butts up to the other. The triangular profile is also shown. If I was to get the Profile loop for this profile it would consist of three ProfileCurve objects and they are represented in the picture below by the black lines. These curves don't really exist in the sketch but are just the results of the profile being calculated and are only part of the profile. I can't offset profile curves. You can only offset sketch curves.

If you know you have clean sketches where the sketch curves connect end-to-end then they will match the profile curves. In the Python code below, (it was quicker to write and test than C++), I do what you described by getting the outer profile loop and iterating over its curves, but for each ProfileCurve I get the associated sketch entity and add that to the collection and then that's what is offset. Hopefully that makes some sense.
def run(context):
try:
des = adsk.fusion.Design.cast(app.activeProduct)
sketchIn = adsk.fusion.Sketch.cast(des.activeEditObject)
profiles = sketchIn.profiles
curvesForOffset = adsk.core.ObjectCollection.create()
profile = adsk.fusion.Profile.cast(None)
for profile in profiles:
loops = profile.profileLoops
if loops.count > 1:
loop = adsk.fusion.ProfileLoop.cast(None)
for loop in loops:
if loop.isOuter:
curve = adsk.fusion.ProfileCurve.cast(None)
for curve in loop.profileCurves:
curvesForOffset.add(curve.sketchEntity)
if curvesForOffset.count > 0:
sketchIn.offset(curvesForOffset, adsk.core.Point3D.create(0,0,0), 1)
except:
if ui:
ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))