Se a diagonal é 0 (no exemplo passado não é), então basta ordenar os valores e escolher aquele que for o primeiro depois da diagonal.
Supondo matriz m x n, basta pegar o menor entre `m` e `n` para determinar a quantidade de valores na matriz.
# cria matriz do exemplo
valores <- c(0, 86.441, 63.108, 120.692, 21.903,
86.441, 0, 7.663, 39.936, 39.71,
63.108, 7.663, 0, 30.014, 32.262,
120.692, 39.936, 30.014, 0, 97.077,
86.463, 5.358, 5.075, 40.632, 41.155, # este ultimo valor deveria ser 0 (zero) para cumprir a regra da diagonal zerada
58.086, 22.672, 5.571, 20.989, 43.635,
160.623, 84.723, 99.275, 59.463, 121.871,
149.096, 78.921, 107.048, 104.64, 94.213)
mat <- matrix(valores, 8, byrow = TRUE)
# determina menor dimensão
menor_dim <- min(dim(mat))
# pega menor valor fora da diagonal
menor_valor <- sort(mat)[menor_dim + 1]
# Determina posição na matriz
posicao <- which(mat == menor_valor)
linha <- posicao %% dim(mat)[1]
coluna <- (posicao %/% dim(mat)[1]) + 1
mat[linha, coluna]
Para determinar o maior valor basta adicionar o argumento `decreasing = TRUE` na chamada da função `sort()`
Aqui só retorna os indices de linha e coluna, mas conseguir o nome depois disso não é difícil.