The Merkle root of the transactions is calculated by building a binary tree from the transactions as leaves where each parent node is the hash of its two children. As the coinbase transaction is the first transaction in the block, you can store the hashing partners on the coinbase transaction's Merkle branch and only repeat all the hashes to which the coinbase transaction contributes. This reduces the required number of hashes to calculate the new Merkle root for n transactions from
O(log(n)) given that no other transactions in the block were changed.
There is no way around repeating the whole left flank of hashes in the binary tree, since changing the extranonce in the coinbase transaction changes the outcome of the bottom left hash combining coinbase transaction and first regular transaction.