Rosberg is now just 17 points behind Hamilton, with 50 up for grabs in the title decider in Abu Dhabi in a fortnight. Should Rosberg prevail there, Hamilton would have to finish second in order to clinch the title.
Rosberg had held his advantage away from the start and led through the first round of pit stops, but Hamilton was closing fast as Rosberg pitted for a second time. The Briton set a new fastest lap of the race, but rather than pit immediately he stayed out and was caught out - on tyres that were finished he locked the rear wheels going into Turn 4 and half spun. Though he recovered quickly, he emerged with a 7.4s gap to work on.
He did so in brilliant style, relentlessly closing that down to less than two seconds by the time of their third and final stops on the 50th and 51st laps, but thereafter Rosberg was able to withstand every attack, avenging his defeat in Austin last weekend.
To the delight of the home crowd, the Silver Arrows duo were joined on the podium by Williams' home favourite Felipe Massa, who took a hard-fought third place after dealing with a five-second stop-and-go penalty when his speed limiter failed to work in his first stop. The Brazilian also lost time when he later pulled in to the McLaren rather than Williams bay during his third stop, because the mechanics waiting for Jenson Button were similarly attired to his own.
Massa's team mate Valtteri Bottas could have been in contention to capitalise, but suffered a delay of his own during his second pit stop and was unable to recover.
Thus fast-starting Jenson Button turned fifth on the grid into a very strong fourth in the race for McLaren, fighting successfully to pull away from Red Bull's Sebastian Vettel and Ferrari's Fernando Alonso. The latter had a late battle with team mate Kimi Raikkonen, who made a two-stop strategy work to claim seventh. The Finn faded over the final laps and was very nearly caught by Force India's Nico Hulkenberg, who was also out of kilter on stops, with just two-tenths of a second splitting the pair at the chequered flag.
Kevin Magnussen was a distant ninth in the second McLaren, while Bottas recovered to take the final point in 10th place. Toro Rosso's Daniil Kvyat was 11th ahead of Lotus's Pastor Maldonado, team mate Jean-Eric Vergne and the Saubers of Esteban Gutierrez and Adrian Sutil, who sandwiched Sergio Perez's Force India in 15th.
There were two retirements: Romain Grosjean had to pull to a halt as smoke engulfed his Lotus on Lap 64, while Daniel Ricciardo - who had initially chased Red Bull team mate Vettel - suffered a front suspension failure.