In Properties, you will notice there are these three properties: JointValues, InternalJointValues, and ExternalJointValues which are all read-only. They are the getters.
In Methods, you will notice there are these two methods: setJoints and setExternalJoints, which do different things. setJoints() can set one, multiple or all joints of a position. setExternalJoints() can only set external joints, so no chance of changing internal joint value.
So you must use a method to set the external joint value of a motion statement. The properties I mentioned can be used as getters, thereby you can modify the list of values as needed and call the methods with the new list of values as the argument.
NB! I do not remember which version number, but I think setJoints() had a bug where the external joint values were not being set with that method, so you had to manually call the setExternalJoints() method to workaround the issue. Not sure if it was fixed in 4.1.
A vcMotionStatement is a vcPosititonStatement, which is also a vcStatement. For built-in motion statements, PTP and LIN, there is only one position, which is a vcPositionFrame. There can be only one position for these built-in types!
In your code, you know how to access and edit that position. However, you must also set the external joint values of that position. Why? The API is not going to assume you want to use the external joint values but not the TCP location of robot when creating a motion statement from scratch/via API.
So create a list of the desired joint values, and then pass that list as an argument when calling setExternalJoints() using the vcPositionFrame object.
If you manipulate the robot controller to the desired joint values and touch-up the position, the external joint values will populate.
But all is not lost. What you can try to do is this:
Create the motion statement.
Immediately after that, use the vcMotionStatement.readIn() method.
Do what you did before, edit the position.
Of course, if you do not like the external joint values, edit them.