Hamilton crossed the line 4.5 seconds ahead of Red Bull's Daniel Ricciardo, with Valtteri Bottas completing the podium.
Hamilton extended his championship lead to 28 points over Vettel, with Bottas 23 points further back in third.
Rain was falling ahead of the start, and the top six drivers - Vettel, Max Verstappen, Ricciardo, Kimi Raikkonen, Hamilton and Bottas - starting on the intermediates while others, including Nico Hulkenberg and the McLarens of Fernando Alonso and Stoffel Vandoorne opting for the full wets.
Raikkonen made a strong getaway from fourth to go three abreast with pole-sitter Vettel and Verstappen on the approach to Turn 1.
Vettel moved across to cover the inside line, squeezing Verstappen, who then made contact with Raikkonen, spearing the Finn across the track into Vettel.
Raikkonen's out-of-control car then collected Verstappen and Alonso at Turn 1, putting Raikkonen and Verstappen out of the race immediately.
The stewards said they would investigate the incident after the race.
Vettel continued in the lead with his damaged car, but then lost control out of Turn 3 and his Ferrari team instructed him to retire the car.
Hamilton inherited the lead, but the race was neutralised when the safety car was sent out so the debris could be cleared.
At the restart, Hamilton bolted away at the front, pulling out a lead of 3.5s over Ricciardo after just one lap with Hulkenberg running third.
The rain stopped on lap six, with conditions rapidly favouring those running intermediates.
The race was neutralised again when Daniil Kvyat crashed after locking up at the end of the back straight and understeering into the wall.
Several drivers, including Ricciardo, took the opportunity to pit for fresh intermediates but Mercedes kept Hamilton and Bottas out on inters.
By the time the safety car came back in at the end of lap 14, everyone was on intermediates apart from Felipe Massa and Pascal Wehrlein.
As the track began to dry, Kevin Magnussen was the first driver to switch to slicks, taking the ultrasofts, while Massa followed suit.
It quickly became clear that was the tyre to be on, sparking a flurry of pitstops, with Ricciardo pitting on L29 in a bid to undercut Hamilton.
Mercedes responded the next lap and Hamilton rejoined in the lead.
He set about pulling away from the Red Bull, building an 18.7s lead over Ricciardo before the field was neutralised for third time when Marcus Ericsson crashed on the Anderson Bridge.
Several drivers pitted for fresh tyres, including Hulkenberg, who also needed an air line plugged into his car which delayed the stop and dropped him from fourth to 10th before retiring the car in the closing stages.
Hamilton pulled clear at the restart, the Mercedes driver quickly building a lead of four seconds.
Mercedes told him to hold that gap to keep the field compressed and avoid giving anyone else a free stop but after a discussion, it told Hamilton he could dictate the pace and ultimately secure his seventh win of the season.
Carlos Sainz finished a career-best fourth for Toro Rosso, ahead of Force India's Sergio Perez, with Jolyon Palmer scoring his first points of the season in sixth.
Stoffel Vandoorne was seventh, with Lance Stroll eighth as Romain Grosjean and Esteban Ocon completing the top 10.
The race became time-limited due to the safety car interruptions, meaning only 58 of the 61 laps could not be completed within the two-hour limit.
15-17 Sep 2017 Marina Bay Street Circuit, Singapore
|2||3||Daniel Ricciardo||RED BULL RACING TAG HEUER||58||+4.507s||18|
|4||55||Carlos Sainz||TORO ROSSO||58||+22.822s||12|
|5||11||Sergio Perez||FORCE INDIA MERCEDES||58||+25.359s||10|
|7||2||Stoffel Vandoorne||MCLAREN HONDA||58||+30.388s||6|
|8||18||Lance Stroll||WILLIAMS MERCEDES||58||+41.696s||4|
|9||8||Romain Grosjean||HAAS FERRARI||58||+43.282s||2|
|10||31||Esteban Ocon||FORCE INDIA MERCEDES||58||+44.795s||1|
|11||19||Felipe Massa||WILLIAMS MERCEDES||58||+46.536s||0|
|12||94||Pascal Wehrlein||SAUBER FERRARI||56||+2 laps||0|
|NC||20||Kevin Magnussen||HAAS FERRARI||50||DNF||0|
|NC||9||Marcus Ericsson||SAUBER FERRARI||35||DNF||0|
|NC||26||Daniil Kvyat||TORO ROSSO||10||DNF||0|
|NC||14||Fernando Alonso||MCLAREN HONDA||8||DNF||0|
|NC||33||Max Verstappen||RED BULL RACING TAG HEUER||0||DNF||0|
|4||Daniel Ricciardo||AUS||RED BULL RACING TAG HEUER||162|
|6||Max Verstappen||NED||RED BULL RACING TAG HEUER||68|
|7||Sergio Perez||MEX||FORCE INDIA MERCEDES||68|
|8||Esteban Ocon||FRA||FORCE INDIA MERCEDES||56|
|9||Carlos Sainz||ESP||TORO ROSSO||48|
|11||Felipe Massa||BRA||WILLIAMS MERCEDES||31|
|12||Lance Stroll||CAN||WILLIAMS MERCEDES||28|
|13||Romain Grosjean||FRA||HAAS FERRARI||26|
|14||Kevin Magnussen||DEN||HAAS FERRARI||11|
|15||Fernando Alonso||ESP||MCLAREN HONDA||10|
|17||Stoffel Vandoorne||BEL||MCLAREN HONDA||7|
|18||Pascal Wehrlein||GER||SAUBER FERRARI||5|
|19||Daniil Kvyat||RUS||TORO ROSSO||4|
|20||Marcus Ericsson||SWE||SAUBER FERRARI||0|
|21||Antonio Giovinazzi||ITA||SAUBER FERRARI||0|
|3||RED BULL RACING TAG HEUER||230|
|4||FORCE INDIA MERCEDES||124|