I've found some documentation of this change: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.infopath.infopathcontrol2.refreshstate%28v=office.14%29.aspx - it's pretty hidden away.
So InfoPath 2007 controls implement the Microsoft.Office.Interop.InfoPath.InfoPathControl interface, while InfoPath 2010 controls implement InfoPathControl2. The latter has an extra method called RefreshState, which is called when the control is refreshed. The msdn doc for this method indicates:
"In InfoPath 2007, when a change occurs to the XML node the control is bound to, InfoPath calls the SaveState() method implemented by the control so that InfoPath can destroy the control, and the control can successfully restore its state when it was reconstructed. In InfoPath 2010, changes were made so that ActiveX controls are not always destroyed and reconstructed when a change to the bound XML node occurs. To fully implement this change, InfoPath 2010 needs a way to communicate to the control that a change to the bound XML node has occurred, and that the control should refresh its state by reading the updated information in the XML node. To do that, the developer of the control must implement the RefreshState() method on the control."
So this is specified behaviour.
Some investigation with the Dispose() method shows that in InfoPath 2010, while new copies of the control are instantiated on every edit, they are immediately disposed, and so aren't hanging around taking up resources. While I'm not really sure why it's implemented this way, it clearly was intentional and so should be safe.