India looked in complete control after Virat Kohli’s unbeaten 89 took them to 192-2 and Chris Gayle fell for five.
But Lendl Simmons, who was twice caught off no-balls and held on the boundary only for Ravindra Jadeja to step on the rope, clubbed 82 from 51 balls.
Then Andre Russell won it with a six with two balls to spare in Mumbai.
West Indies, champions in 2012, follow their women’s team into the final after they defeated New Zealand earlier on Thursday.
The meeting with 2010 winners England in Kolkata will see a two-time World T20 champion crowned for the first time, while India’s exit extends the wait for a host nation to lift the trophy.
Simmons, who had to pull out of the West Indies squad before the tournament began because of an injury, only arrived in Mumbai on Tuesday as a replacement for Andre Fletcher.
When he got to the crease at the end of the third over, West Indies already looked out of the chase after opener Gayle was bowled by Jasprit Bumrah and Marlon Samuels was tamely caught at cover.
Three times he could have been out. Ravichandran Ashwin overstepped when he was caught on 18 and Hardik Pandya did the same at 50, the latter being heaved for six from the resulting free hit.
Then, on 69, Simmons was held on the long-on boundary, only for Jadeja to step on the rope as he was trying to offload the ball to Kohli.
Reprieved, Simmons slapped boundaries through the off side and clubbed five sixes straight and to the leg, sharing 97 with Johnson Charles and an unbroken 80 with Russell.
Windies blow through Mumbai
It was an astonishing chase by West Indies, their second highest in T20 internationals and the second largest by any side to defeat India.
While India grew their total by breathlessly scampering between the wickets, West Indies pummelled the boundary on the same run-filled Wankhede Stadium at which England made 230 to beat South Africa.
As West Indies crashed 20 fours and 11 sixes, the previously raucous Mumbai crowd fell increasingly silent. India, the pre-tournament favourites, could have gone out in the group stage and, when the semi-final came, their bowlers wilted.
But Kohli, who should have been run out by Dwayne Bravo when he was on only one, did not deserve to end up on the losing side.
The right-hander’s innings was another T20 masterclass, full of orthodox cricket strokes and brilliant running between the wickets, taking his tournament record to 273 runs at an average of 136.50.
Then, when India were being dismantled in the field, Kohli was thrown the ball and had Charles caught at long-off with his first delivery.
He was even given the responsibility of bowling the final over when only eight were needed. This time, there was too much even for Kohli to do as Russell heaved the winning maximum over mid-wicket.
What they said
Man of the match Lendl Simmons: “I was under pressure, the team said I had to deliver and I guess I did tonight. We didn’t get the start we wanted and then I got three chances and I just cashed in.”
West Indies captain Darren Sammy: “I said they were 10 runs short. Even when we lost Gayle, we had Simmons just off the flight. We have two West Indies teams in final and I know that means a lot to the Caribbean.
“Yes Gayle is our best player but we have 15 match winners. Today Charles, Simmons and Russell took responsibility.”
India captain MS Dhoni: “The only thing I’m disappointed about was the two no-balls [to reprieve Lendl Simmons]. Other than that we did our best. I thought 190 was a good score. It’s a demanding format, it was draining because a few of our games were very close.”