Dont know if this is possible in C++ but this is how I do it in vb.NET

Dim DefLine As Geometry.Curve = Curve //Defined somewhere else.
Dim midPoint As Double = DefLine.GetLength / 2
Dim myMidPoint As Geometry.Point3d = DefLine.PointAtLength(midPoint)

Get the curve length, devide it by 2, get PointAtLength.

As for the reason why: a NURBS curve is a parametric curve, so it is a function of the parameter t

f(t) -> (x,y,z)

The “speed” with which the curve is drawn as the parameter t goes from the domain start (T0) to the domain end (T1) depends on a) the knot sequence of the curve and b) the location of the control points. So, evaluating the middle of the parameter domain (T1-T0)/2 is (almost) never equivalent to the middle of the curve in terms of its length. Instead, you need to find the parameter t, for which the curve’s length at that value is half of the length of the complete curve.