Sobre DRY, entendo que não é à qualquer custo, existem situações de duplicação que são convenientes simplesmente porque coisas inicialmente semelhantes são alteradas por motivos diferentes e passam ter sua própria trajetória.

Para criarmos abstrações que façam sentido, primeiro precisamos conhecer bem o problema, coisa que muitas vezes chegamos ao "pleno" conhecimento após uma boa vivência influenciados pelo contexto de negócio e mantendo a base de código. Algumas regiões do código começam a se estabilizar, revelar padrões e, outras continuam em constante mudança tendo ligação direta com demandas latentes que geram valor para a empresa.

Uma vez assisti uma apresentação na qual o palestrante fazia analogia entre código quente, com um campo que precisa de fertilizante para potencializar a produção e prosperar o plantio. O fertilizante poderia ser entendido como código que é alterado a todo momento, com soluções potencialmente não definitivas, mas que faz o resultado ser alcançado. É nele que tudo está acontecendo. Em outras palavras, "onde há MERD*, há grana".

As "zonas quentes" do código precisam se provar, há um nível de incerteza altíssimo sobre elas, até mesmo qualidade comprometida em favor de uma entrega de valor, dado prazo, custo, etc. Desenvolvedores não são artesãos porque precisam empoderar o negócio para que a empresa tenha sucesso.

Códigos já consolidados com pouca alteração tende a ser bons cadidatos à abstração, otimização, etc.

Dito tudo isso, bom senso é algo que deve ser praticado, código deve trazer consigo boas práticas para se manter saudável ao longo do tempo, então o extremismo em qualquer direção deve ser evitado.

Quanto ao código exemplo, podemos dizer que refatoração é algo que "tende ao infinito" (você decide quando parar). Se separarmos responsabilidades e fizermos uso de composição, teríamos:

const sum = (a, b) => a + b

const subtract = (a, b) => a - b

const multiply = (n, m) => n * m

const multiplyBy = m => n => multiply(n, m)

const double = multiplyBy(2)

const sum2ab = (a, b) => sum(double(a), b)

const sub2ab = (a, b) => subtract(double(a), b)