Как удалить элемент массива в localstorage, по нажатию на крестик, и перезаписать массив?
1. меньше вложенности
if (data) { ... длинная простыня кода }, при отсутствии else лучше заменить на:

if (! data) return;
...тот же код, на уровень левее
2. некруто объявлять функции внутри if() и тем более внутри цикла for()

3. DRY ("Don't Repeat Yourself" – «не повторяйся»). При обнаружении сохранённых элементов в LS, и при создании новых, происходит одно и то же действие: создание элемента списка, навешнивание событий и пр. В функцию его.

По сути вопроса опять предложу переосмыслить архитектуру. Без деталей, в общем: есть массив (пустой, или заполненный из localStorage). Свежесозданные задания попадают в массив. Удаляемые — удаляются из массива.
При изменениях массива — сохранять обновлённый в LS; стирать всё нарисованное ранее, и рисовать весь список с нуля, как будто только загрузили страницу. Ничего, это быстро )
Нужно использовать обертку+замыкание для обработчика, удаляющего элемент по клику.
tasks.push(data); // тут вставили очередной элемент
let task_index = tasks.length - 1; // узнаем его индекс по длине массива, так как он в текущей ситуации последний
// несколько строк спустя
b1.addEventListener("click", 
(function(inner_task_index) // функция-обертка для изоляции контекста, сюда передается значение task_index, я специально выделил его другим именем inner_task_index, чтобы видеть контекст функции-обертки
  {
// обертка возвращает функцию-обработчик события  для addEventListener
return function delFromLocalSt() {
    task.removeChild(li);
        let array = JSON.parse(localStorage.getItem('task'));
        array.splice(inner_task_index, 1); // удаляем элемент по известному индексу используя механизм замыкания, используя контекст функции обертки
    localStorage.setItem('task', JSON.stringify(array));
   }
})(task_index) // вызываем хитрую обертку, чтобы обеспечить изоляцию переменной от контекста функции createEl
);