The issue I see with this is that your accessing the variable when the callback is called, not when the callback is written. Since this is asynchronous, the function you are defining as the callback is accessing the counter variable after all 5 instances of the action have been en-queued so counter would be 5 in all callbacks..
Passing extra data to a callback does not seem possible to me as you are not the one calling the method. Your method gets what ever parameters are passed to it by the action.setCallback method. In this instance, you get the response object.
My recommendation is move the for loop containing the counter to the apex side of the equationequation; if possible. RatherSend the list to the apex controller rather than looping through a list of data and callingen-queuing the methodaction 5 times, send the list to the method, have the method run. Have the controller loop, through the records and return a set of results that you can loop through in the javascriptJavaScript.