The 37-year-old American recovered from a set down to claim a 6-7 (3-7) 6-2 6-3 semi-final win over France's Garcia and make her first final since 2009.
Denmark's Wozniacki, 27, booked her place by seeing off Czech Karolina Pliskova 7-6 (11-9) 6-3 in Singapore.
Pliskova's defeat means Simona Halep will end 2017 as world number one.
Fifth seed Williams will go into today's final with a 7-0 record against sixth seed Wozniacki stretching back to 2007.
Garcia had claimed the final spot in the season finale after winning successive WTA titles at the Wuhan and China Open, but her impressive form was ended by 2008 champion Williams.
After dominating the tie-break to take the opening set, Garcia was outplayed by Australian Open and Wimbledon finalist Williams, converting just one of her 13 break points.
The American hit back to take the next two sets, recovering from 0-40 down to serve out the match and make her first appearance in the final for eight years.
She overtakes the 36-year-old Martina Navratilova in 1992 as the oldest woman to reach the final of the season-ending championships.
"It's hard to produce your best tennis at the end of the year because you've given so much but it's so important to do that in this tournament," Williams said.
"It's amazing to almost be standing in the winner's circle. It's not over till the fat lady sings and I'm not fat. I watch my figure."
Third seed Pliskova could have taken the number one spot from Romania's Halep with victory at the WTA Finals.
She was thwarted in the semi-final by Wozniacki's relentless defence - which saw the Dane reach her first final in seven years.
Both players wasted chances to win the opener in Singapore - Pliskova found success with her attacking shots and earned a 5-3 lead in the first set but Wozniacki used her stonewall defence to stay in touch.
The world number six then broke Pliskova as she looked to serve out the first set, before battling hard to take it to a tie-break.
Wozniacki wasted five consecutive set points from 6-1 up in a dramatic tie-break, as her opponent blew three of her own, before the Dane prevailed.
In a tight second set there were five breaks of serve, but despite hitting far fewer winners, Wozniacki's defence forced Pliskova into some decisive errors as she struggled to cover the court.
Wozniacki ended the match with just nine unforced errors to earn a shot at her first end-of-season title.
"That was a little bit crazy. It was a rollercoaster, I'm just happy I got that first set under my belt," said Wozniacki.
"I've been playing really great tennis this week so to be in the finals, it means a lot to me."