There's likely a better way to do this but this is the way I've done something similar...you'll have to do some scripting.
You'll need two scene directors. You'll also need three text fields for every choice you have. (in this case, 15 text fields) -- one field is used to hold the value of the "old" value, one is Datalinq'd to your source percentages, and the other is the actual text object that is displayed showing the percentage. The first of the two there will just be hidden text fields. Just make them invisible.
Animate your bars in, just like you have it now. Once it's all in (and you've disabled the method by which the bars are updating at this point), you'll want to add a line of scripting to your first SceneDirector to play the second, which looks like this:
Dim sd2 as xpSceneDirector
scene.getSceneDirectorByName("SceneDirector2", sd2)
sd2.play()
In the second scene director, you'll add an event at the frame number/duration that you'll want the poll to update. The event just needs to tell the scene director to jump back to frame 0. I added the event at frame 62, with a scripting event at frame 61. The scripting event tells the animation to take place over frames 0-60... which leads me to the fun part.
The script action at frame 61 The script action should get all the objects by name that are involved (so all fifteen text objects, the animation controller on the second scene director, and any objects used to create the bars).
The script will set a keyframe at frame 0 based on the old percentage, and a keyframe at frame 60 based on the new percentage. So in my case I set the bar graph up on a scale of 600 pixels to make the math easy. So in calculating the x position of the keyframes, a percentage of 100 would represent 600 pixels, so 6 * (percentage) + (offset). Offset being how far from the left side of the scene you want the bars to start. For example:
scene.getAnimControllerByName("AnimController2", ctrl)
ctrl.setKeyFramePosition(maska,0,(6*(cint(aold.text)))+900,476.998,0)
ctrl.setKeyFramePosition(maskb,0,(6*(cint(bold.text)))+900,348.998,0)
ctrl.setKeyFramePosition(maskc,0,(6*(cint(cold.text)))+900,222.998,0)
ctrl.setKeyFramePosition(maska,60,(6*(cint(anew.text)))+900,476.998,0)
ctrl.setKeyFramePosition(maskb,60,(6*(cint(bnew.text)))+900,348.998,0)
ctrl.setKeyFramePosition(maskc,60,(6*(cint(cnew.text)))+900,222.998,0)
The quads I was using to show/hide the bars was a mask, so I keyframe the mask to move from the old percentage to the new percentage. After all this scripting is done, you move the text that is in the datalinq'd text object to the "old" text object, e.g:
aold.text = anew.text
bold.text = bnew.text
cold.text = cnew.text
And the loop continues once a second. Unfortunately you can't set just the X position using setKeyFramePosition() so you'll have to go into the scene and find what the Y position of each option should be individually, and the Z position if necessary. In my case I wasn't using round caps on the end of the bars like you are, but realistically you should only have to keyframe one of the objects and continue using visual logic to move the caps at the position changes. Also I said you would need three text fields per option above, reason being I'm using cint to convert the percentage to an integer to use in the math above -- therefore the % character can't be in that field when you do that. You can add it back in with scripting, or, just do it in visual logic to match the "new" text field and add the "%" from there.
Now if you really wanted to get fancy and make the percentage text field go up and down with the bars instead of just changing once a second while the animation takes place, you can do that all in visual logic. Add an invisible quad at X = 0, and link it to a text field in visual logic. In between the two of those, you'll need to take the floor of the quad X position (so you don't get the decimal positions) and then use a replace block to get rid of the .000. Then keyframe that field using a similar method as above and you'll see the numbers change in sync with the bars. Only difference is the X is literally old and new positions, respectively, no extra math required.
I know this is fairly brief for as complicated as it can be, but hopefully it helps.
#XPression