Какой алгоритм быстрее и почему?
Ваш алгоритм хорош. 
Лучше «лаконичного» тем, что не занимается сортировкой там, где это не нужно.
Представьте массив [1, 2, 1000, 1001,...] далее все 100500 элементов больше 1000. 
Совсем незачем сортировать весь этот максимальный хвост между собой, когда интересуют только минимальные значения.

Вот разбор проблемы поиска двух наименьших значений в массиве. Там ешё предлагается вариант в 2 прохода по массиву: найти наименьшее, и вторым проходом найти наименьшее, большее найденного. Тоже O(n), но можно и за 1 проход, как вы и предложили.
вариант
Без пересоздания массива. Держать две переменные, значения, которых по возрастанию. Максимум две проверки условий на итерации.
const sumTwoSmallestNumbers = arr => {
  let a = arr[0];
  let b = arr[1];
  if (a > b) {
    [a, b] = [b, a];
  }

  for (let i = 2; i < arr.length; i++) {
    const v = arr[i];
    if (v < a) {
      b = a;
      a = v;
    } else if (v < b) {
      b = v;
    }
  }

  return a + b;
};

sumTwoSmallestNumbers([55, 44, 1, 99, 2]); // 3
В зависимости от условий (уникальность, сортировка выходного и прочее) можно упростить до подобного: https://codepen.io/FragsterAt/pen/vYaBNam
предложенный вариант без sort действительно быстрее, но менее читаем. Реальная обоснованность зависит от условий. Может быть там до 100 элементов. Зато сразу понятно, что происходит (при рефакторинге).