Performing a "mean blur"
Convolution Filter
In CG this type of processing is call a convolution filter and there are many strategies used to handle edges
As the previous answer points out for performance you are best to use typed arrays and avoid creating arrays for each cell you process.
In your example

for (let i = 1; i &lt;= kernelSize; i++) {
    adjacentValues = adjacentValues.concat(this._getAdjacentValues(row, col, i, grid));
}
const average = adjacentValues.reduce((a, b) =&gt; a + b, 0) / adjacentValues.length;


You can do the reduce in the loop you create the sub array in, and avoid the 9 new arrays you create and the need to iterate again.
Example substitute value at edges.
const edgeVal = 0;
var val, sum = 0;
for (let i = 0; i &lt; 9; i++) {
    val = grid[row + (i / 3 | 0) - 1];
    if (val !== undefined) {
         val = val[col + (i % 3) - 1];
         sum += val !== undefined ? val : edgeVal;
    } else {
         sum += edgeVal;
    }
}
const average = sum / 9;

Or ignore edges
var val;
var sum = 0;
var count = 0;
for (let i = 0; i &lt; 9; i++) {
    val = grid[row + (i / 3 | 0) - 1];
    if (val !== undefined) {
         val = val[col + (i % 3) - 1];
         if (val !== undefined) {
            sum += val;
            count ++;
         }
    }
}
const average = sum / count;

Better yet, work on flattened arrays to avoid the double indexing for 2D arrays, and create the result array at the start rather than pushing to it each cell.
Workers
Convolution filters are ideally suited for parallel processing with an almost n / p performance increase (n is number of cells, p is number of processing nodes).
Using web workers on a i7 4 core (8 virtual cores) can give you a 8 times performance increase (On chrome (maybe others) you can get a core count at window.clientInformation.hardwareConcurrency)
Attempting to use more workers than available cores will result in slower processing.
GPU
For the ultimate performance the GPU, via webGL is available and will provide realtime processing of very large data sets (16M and above), A common non CG use is processing layers in convolutional neural network.
An example of a convolution filter (About halfway down the page) using webGL can easily be adapted to most data types, however doubles will only be available on a small number of hardware setups.