Путаница в том, что между обоими && есть только ОДИН пробел.
Если бы было ДВУХ пробелов, то это работало бы так, как ожидалось, но зачем беспокоиться о включении пробелов в регулярное выражение? "(&&)" не будет работать хорошо?
>>> import re
>>> string = " && && 7978888 && 896"
>>> tmp = re.sub(r"&&", "and", string)
>>> tmp
' and && 7978888 and 896'
Если этого недостаточно, какие еще уникальные ограничения вам нужно соблюдать?