The away win helped them to continue their superb start to the 2019/2020 campaign.
Sweden international Alexander Isak came off the bench to decide the match with nine minutes remaining.
He met a pass from Martin Odegaard with his back to goal and then freed himself from two defenders to score.
Celta Vigo forward Santi Mina missed two clear chances to give his side the lead before half-time.
The match began to slip from the hosts after Pape Cheikh was sent off for a second yellow card midway through the second half.
The win takes Real Sociedad second with Barca on 19 points after 10 games.
But the Catalans have a game in hand after the ‘Clasico’ against Real Madrid, originally scheduled for Saturday, was postponed until December due to security concerns.
Atletico Madrid, who also have 19 points, are third after beating Athletic Bilbao 2-0 on Saturday.