Determining cell direction in a 2D grid
Because neither row nor board.height depend on col, you could save two comparisons and an and in your getMatrixNeighbors function:

for(var row = y - 1; row &lt;= y + 1; ++row) {
    var isInBounds = (row &gt;= 0 &amp;&amp; row &lt; board.height);
    for(var col = x - 1; col &lt;= x + 1; ++col) {    
        if ( col &gt;= 0 &amp;&amp; col &lt; board.width
                      &amp;&amp; isInBounds) {
            neighbors.push(board.at(row, col));
        }
        [...]
    }
}


Note also that I removed the unneeded cell variable. It will probably not increase performance, but the code is nicer, I think.

I don't know what values x and y could possibly have, but I would assume that you can somehow save checking col &gt;= 0 (and possibly some of the other bounds checks) each time.

You could also try to save x + 1 and board.width in a local variable to save the computation/accessing, but I would assume that either the compiler optimizes this for you, or that the introduction of an additional variable offsets the performance gain. 

I don't think that getBodyDir is the bottleneck (although it would be good if you would profile this), but here you could also save the result of isSnake(top) etc in a local variable, instead of saving top as you are currently doing (top is never used anywhere except as argument for isSnake, so this would actually make sense and should result in nicer code).