У тебя дохрена всего лишнего. Как минимум, pixelatedImage.src = canvas.toDataURL(); в каждой итерации - это прямо вишенка на торте.
показывай анимацию на канве, а не в элементе img
Однократно:
1) создать канву нужных размеров, кинуть на неё картинку
2) забрать originalImageData = context.getImageData(...)
3) создать новый targerImageData = context.createImageData(width, height)
На каждой итерации (на каждом срабатывании таймера):
1) Обойдя пиксели originalImageData, заполнить соответствующие квадраты в targerImageData
2) Вызвать context.putImageData(targerImageData, 0, 0)
Если у тебя большая картинка и это всё равно будет подтормажвиать, то стоит попробовать вынести работу с originalImageData и targerImageData в отдельный поток. При этом targerImageData нужно
правильно перекидывать между потоками.
Как вариант, можно попробовать раскурить webgl, тут подсказать не могу, не пробовал.