I've had a look at this, so I can now give a better answer than I could on the forums.
The reason they are different is because fire1 is siimulated via the built-in per-frame system, and fire2 is fast-forwarded to the time of fire1 via the Simulate API method.
The first method advances the simulation by the timestep each frame (Time.deltaTime), whereas the second method (SImulate) advances the simulation by a fixed timestep. This difference causes the divergence.
If you want to set the state of fire2 to exactly match fire1, call GetPlaybackState on fire1, and then SetPlaybackState on fire2. This copies the entire state exactly from one system to another. (you'll also need to call Get/SetParticles to copy the actual particles over too, and if you use trails, there is another API to copy trails data over too.. Get/SetTrailsData i think)
Alternatively, to keep them in sync, you could simulate Fire1 yourself in the script too. So, instead of using the Play/Stop API, use Simulate for fire1. You'll need to ensure the fixedTimestep param is true, which may make the playback not entirely smooth.