ES6 / ES2015では、Object.keysとreduceの使用を新しいObject.assign関数、矢印関数、計算されたプロパティ名と組み合わせて、非常に簡単な単一ステートメントソリューションを実現できます。
const foo = { a: 1, b: 2, c: 3 };
const bar = Object.keys(foo)
.reduce((obj, key) => Object.assign({}, obj, { [foo[key]]: key }), {});
オブジェクトスプレッドオペレーター(これを書いている時点ではステージ3)を使用してトランスパイルしている場合は、少し簡単になります。
const foo = { a: 1, b: 2, c: 3 };
const bar = Object.keys(foo)
.reduce((obj, key) => ({ ...obj, [foo[key]]: key }), {});
最後に、Object.entriesを使用できる場合(執筆時点ではステージ4)、ロジックをもう少しクリーンアップできます(IMO)。
const foo = { a: 1, b: 2, c: 3 };
const bar = Object.entries(foo)
.reduce((obj, [key, value]) => ({ ...obj, [value]: key }), {});