◆ Math.max して indexOf より for のほうが速い
  ◆ Math.max の可変長引数は限界があって Chrome だと 100 万件は無理
◆ for の方法で 100 万件の処理を 1 万回で 8 秒くらい
◆ Python の numpy でやると 7.7 秒くらい

JavaScript の標準機能では渡した引数の中で一番大きい値を返す Math.max はありますが 配列の中で一番大きい値は何番目かを知る機能はありません

自分で作る必要がありますが やり方は基本この 2 つかと思います

方法 1 : for でひとつずつ見ていく

for 文でひとつずつ値を見ていって 最大値と同時にインデックスも保存しておく方法です
全部を見た後に値ではなくてインデックスを返せばいいです

function maxIndex1(a) {
let index = 0
let value = -Infinity
for (let i = 0, l = a.length; i < l; i++) {
if (value < a[i]) {
value = a[i]
index = i
}
}
return index
}

方法 2 : Math.max + indexOf

Math.max で最大を取得して その値が何番目なのか indexOf を使って調べます

function maxIndex2(a) {
return a.indexOf(Math.max(...a))
}

速度比較

2 つ目の方法は考え方がシンプルで コードも短いです
ですが 内部的には最大値見つけてそれをもう一回探すという 2 度手間なことしてますし パフォーマンスはよくなさそうです
要素数が多いとけっこう大きな差になるんじゃないかと思ったので 比較してみました

function makeDummy(len){
return Array.from(Array(len), e => Math.random())
}

const dummy_list = [
makeDummy(1),
makeDummy(1),
makeDummy(10),
makeDummy(10),
makeDummy(100),
makeDummy(100),
makeDummy(1000),
makeDummy(1000),
makeDummy(10000),
makeDummy(10000),
makeDummy(1000000),
makeDummy(1000000),
]

// 1
for(const a of dummy_list){
console.time(1)
for(let i=0;i<10000;i++)
maxIndex1(a)
console.timeEnd(1)
}

// 2
for(const a of dummy_list){
console.time(2)
for(let i=0;i<10000;i++)
maxIndex2(a)
console.timeEnd(2)
}

1, 10, 100, 1000, 1 万, 100 万の要素の配列をそれぞれ 2 つずつ準備します
中身はランダムな数値です
各配列に対して最大値のインデックスを探す処理を 1 万回行った時間を計測しています

1: 1.22314453125ms
1: 0.399169921875ms
1: 0.322998046875ms
1: 0.323974609375ms
1: 0.86279296875ms
1: 0.8701171875ms
1: 7.39501953125ms
1: 6.9951171875ms
1: 64.890869140625ms
1: 64.408203125ms
1: 8160.727783203125ms
1: 7922.542236328125ms

2: 1.43701171875ms
2: 0.702880859375ms
2: 1.136962890625ms
2: 1.135986328125ms
2: 8.545166015625ms
2: 7.707275390625ms
2: 66.37109375ms
2: 71.2080078125ms
2: 722.656982421875ms
2: 720.421875ms
Uncaught RangeError: Maximum call stack size exceeded

1 回目はいつものことですが 最適化とかいろいろやってるので遅いです
Math.max を使う方は可変長引数なので最大数に限界があります
100 万になるとスタックのサイズを超えてエラーでした

比較しづらいので まとめました

要素数forMath.max+indexOf
11.2231.437
10.3990.703
100.3231.137
100.3241.136
1000.8638.545
1000.8707.707
1,0007.39566.371
1,0006.99571.208
10,00064.891722.657
10,00064.408720.422
1,000,0008160.728n/a
1,000,0007922.542n/a

もしかすると Math.max も indexOf も組み込み要素だから JavaScript の for 文よりは遅いかもとも考えましたが やっぱり for 文で無駄なく 1 パスで処理できる方が早いですね

配列の要素数が 100 件から速度が 10 倍近くになってますし 100 万件だと Math.max ではエラーで実行できてません
とりあえず for を使えばよさそうです

python

この結果は Chrome 72 のものです
Chrome (V8) はよく速いと言われるので 他言語と比べるとどんなものか気になりました
python の numpy って配列計算が早いとか聞いたことあったので numpy を使って最大のインデックスを求める速度を計測します

import numpy as np
x = np.random.rand(1000000)
y = np.random.rand(1000000)

%%timeit
x.argmax()

765 µs ± 4.85 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%%timeit
y.argmax()

769 µs ± 6.67 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

2 パターンの配列でやってみましたが ほぼ同じですね
1 回あたり 765µs (0.765ms) だとすると JavaScript の結果は 1 万回実行したものなので

0.765ms x 10,000 = 7,650ms

ほぼ変わらないですが JavaScript よりちょっとだけ速いです