Bom dia, Rodrigo.
Que observação perspicaz, meus parabéns por ter notado isso.
Não é qualquer um que consegue descobrir esse padrão.
Vou te dar um breve resumo dessa incrível funcionalidade do Python.
Antes, aqui está o TLDR;
Numpy é escrito em C. Portanto, é muito mais rápido, mas não recebe as otimizações do interpretador Python. Código Python, como no caso de operações com listas passam por otimização do interpretador quando o código aparenta ser muito utilizado (ou seja, a mesma linha é rodada muitas vezes).
Primeiramente, não é um pseudo-ganho, é um ganho real, pois isso acontece, por exemplo, se você tiver um programa que contém uma função que é executada várias vezes, fazendo com que aquela linha de código seja rodada várias vezes, isso vai se repetir.
Com relação às arrays não ficarem mais eficientes com o tempo: A biblioteca numpy é extremamente mais rápida que o mesmo código usando Python normal, pois a biblioteca é escrita em C, uma linguagem mais eficiente e veloz para atividades de processamento intenso que Python (Python em si é escrito em C, mas o código Python tem que ser interpretado em um processo complexo que não vou elucidar aqui, mas que, no final, temos um interpretador com código C muito complicado sendo usado para ler comandos vindos do seu código Python e interpretar eles), e, infinitamente mais rápida.
Como Numpy é escrito em C, ele é muito mais rápido que código escrito em Python, pois ele vai direto no C, ele não passa por esse processo complexo de interpretação. Contudo, exatamente por conta disso, o numpy não se beneficia dos processos que o interpretador Python usa para otimizar o seu código.
Já a lista, é código Python. Portanto, fazer operações escritas em Python com listas serão otimizadas pelo interpretador. Entre essas otimizações, existe uma que surgiu no Python 3.11 (estamos no 3.13 hoje, e o 3.14 vai ser lançado no fim do ano), que envolve otimizar o bytecode de python. Não irei me alongar nisso, a menos que peça, pois estaríamos caminhando por uma conversa mais complicada. Mas, se quiser, é só falar que eu explico.
Então, para resumir, a lista passa por uma otimização do interpretador python, que a array não passa por ser escrita diretamente em C.