The bill goes back to the Republican-led Congress, which does not have the votes to override the veto.
Obama's veto was expected, but it marks the first time Republicans have been able to get a bill that would repeal his signature health care law to the White House, after more than 60 votes to roll back all or part of the law.
In his veto message, Obama stressed the number of times congressional Republicans have tried to "repeal or undermine the Affordable Care Act."
"Rather than re-fighting old political battles by once again voting to repeal basic protections that provide security for the middle class, members of Congress should be working together to grow the economy, strengthen middle-class families, and create new jobs," Obama wrote.
"Because of the harm this bill would cause to the health and financial security of millions of Americans, it has earned my veto," he added.
The measure would also have barred federal money for Planned Parenthood, something conservatives in Congress vowed to do after a series of videos released by an anti-abortion group last year triggered a controversy about the sale of fetal tissue. Planned Parenthood maintains the footage was edited and denied any improper activity.
House Speaker Paul Ryan pledged to hold an override vote.
"It's no surprise that someone named Obama vetoed a bill repealing Obamacare," Ryan said in a statement.
"But here's the thing. The idea that Obamacare is the law of the land for good is a myth. This law will collapse under its own weight, or it will be repealed. Because all those rules and procedures Senate Democrats have used to block us from doing this? That's all history," he added. "We have now shown that there is a clear path to repealing Obamacare without 60 votes in the Senate. So, next year, if we're sending this bill to a Republican president, it will get signed into law."