◆ onchange を timeout でずらせばエラーメッセージが出る
◆ Chrome 以外も同じ
◆ change のタイミングがフォーカスの切り替わりだから 出ようとしたけどフォーカス外れて消える?
  ◆ 稀に一瞬薄く出始めて表示され切る前に消えることがある

簡単な input の値チェックなら reportValidity を使うのですが onchange で使うと動きませんでした

<!doctype html>

<h1>onchange</h1>
<input id="a" type="number" max=10>
<h1>onchange+timeout</h1>
<input id="b" type="number" max=10>
<h1>oninput</h1>
<input id="c" type="number" max=10>

<script>
a.onchange = eve => console.log(a.reportValidity())
b.onchange = eve => setTimeout(() => console.log(b.reportValidity()), 0)
c.oninput = eve => console.log(c.reportValidity())
</script>

DEMO

setTimeoutでずらしたり oninput だと問題ありません
エラーメッセージが出た瞬間に別のところにフォーカスが切り替わるのでキャンセルされてそうです
入力途中でいちいち言われるのは邪魔なのでoninput よりフォーカスはずれた onchange で使いたいのですがいまのところ setTimeout が必須みたいです

Firefox や Edge で試してみても一緒でした
ただこれらはエラーがあるとデフォルトで赤くなるのでわかりやすいです
Chrome の場合は何も変わらないので赤くしたいなら自分で :invalid にスタイルを設定する必要があります
IE はそもそも対応してないので何も起きません