Hamilton, who won his fourth world championship two races before the end of the season, appeared quicker in the second part of the race.
But he could not get quite close enough to challenge for the lead in a drab and largely action-free finale.
Sebastian Vettel was outclassed in third place to underline the anti-climatic way in which Ferrari have ended a season that had for so long promised so much.
Hamilton and Vettel had both wanted to end this season with a victory, for different reasons - Hamilton to prevent his former title rival from winning the last two races; Vettel to give Ferrari a boost going into the off-season.
But Bottas, who has struggled for form in the second half of the season, drove a composed and impressive weekend, beating Hamilton to pole and controlling the race from the front.
Unlike in Brazil last time out, where he lost the race at the first corner after being passed by Vettel, Bottas made a strong start and imposed himself on the race from the first lap.
Bottas had a 2.5-second lead when he made his only pit stop on lap 20. Hamilton stayed out for three further laps in an attempt to try to extend enough of a lead to rejoin the track in front but did not have enough pace.
He set a fastest lap on lap 21, but Bottas lowered that mark on lap 24, suggesting that had Hamilton extended his run, he would have lost ground rather than gained it.
Hamilton reduced Bottas' lead by 0.7 seconds on his first flying lap on his new tyres, getting to 1.1secs behind his team-mate, where he stayed for four laps before running wide at Turn 17 and losing a little time.
For the rest of the race, Hamilton was within 1.5secs of Bottas but the stalemate remained to the end.
A lock-up by Bottas at the Turn Five hairpin on lap 49 allowed Hamilton to close up, but again he lost ground in the twisty final sector as his car's aerodynamics were disrupted by the dirty air behind the leading Mercedes.