Hi Jean-Philippe,
The behavior you are seeing is the expected behavior.
What is happening is that the statechart is sitting and waiting for the asynchronous trigger, and as such already has its input values determined for the next step it takes. After it takes that step, when you come back into the loop again, the source of the statechart inputs is re-read and these new values sit and wait for the next asynchronous step. Because of this you see this behavior where it seems like the input data is one step behind.
I think if you turn execution highlighting on in the caller of your statechart, you will see what I am talking about. The input data will flow to the Run Statechart node, and then the node will sit there and wait until the asynchronous trigger is sent. The next time in the loop new data will flow into the Run Statechart node.
There is not currently a way to pass data directly with your trigger, which is probably what you are wanting to do. You can use the workaround you described, or you might consider using a synchronous statechart if that would work with what you are doing.
You could also consider using a LabVIEW queue as one element of your statechart inputs as a way to push data into the statechart with the trigger. Basically you feed the reference to the queue into the statechart, and then use the same reference from the place you send the trigger to push some data into the queue before sending the trigger. Then your statechart can read this data out of the queue. If you want more details on this, let me know and I can find them.