The 109th-ranked Russian will play the final of the outdoor hardcourt tournament in southern Brazil against Monica Niculescu of Romania, who defeated seventh-seeded Kristina Mladenovic of France 6-0, 6-2.
Puchkova broke Williams's serve late in the second and third sets to close out the match in 2 hours, 31 minutes, reaching her first final since 2006.
Williams broke Puchkova's serve at 5-4 to win the first set and was up 2-0 in the second. However, she was not able to keep up with the 25-year-old Russian and was broken in the final game of each of the last two sets. Visibly tired and taking her time after every point near the end, Williams gave up 18 break points and was broken six times throughout the match.
"I gave my best but just couldn't play consistent enough today," Williams said. "She played so well, it was hard."
The 20th-ranked American was playing in her first tournament since losing to Maria Sharapova in the third round of the Australian Open in January.
The 32-year-old Williams was trying to win her 45th singles title, and first since last October in Luxembourg. She hasn't made a final since.
Williams had a relatively easy win over fifth-seeded Magdalena Rybarikova of Slovakia in the quarterfinals, but she needed more than two hours to beat the 96th-ranked Garbine Muruguza of Spain in three sets in the second round.
Puchkova will be trying to win her first title after two runner-up finishes in 2006. Her remarkable campaign in Brazil began with a first-round victory over third-seeded Kirsten Flipkens of Belgium.
"I'll just try to play my best," Puchkova said. "Let's see what's going to happen."
The 75th-ranked Niculescu, who is just two days older than Puchkova, also will be trying to win her first title. She hadn't made a final since losing to Williams in Luxembourg last year. She also played the final in Luxembourg in 2011.
Niculescu dominated from the start against the 58th-ranked Mladenovic. She had 11 break opportunities and converted on seven of them to win the match in 1 hour, 3 minutes.