◆ グローバルの undefined はイミュータブル
◆ 普通は未宣言の変数を undefined 確認しないし typeof なしで直接比較で良さそう

typeof val === "undefined" って最近あまり見ない気がします

グローバルの undefined は configurable が false でイミュータブルですし ローカルにわざわざ undefined なんて宣言しないでしょうし val === undefined で十分ってことでしょうか
私もそれしかつかってないですけど

あえて使う時といえば 宣言されてるかわからないときです
typeof なしでいきなり変数にアクセスすると 宣言されてないと ReferenceError で not defined と言われてしまいます
でも ほとんどのときって 宣言されてますよね
宣言すらされてない可能性があるのを確認なんて eval 系でもつかわないと起きない気がします

if 文内で var 使っていてもスコープの最初で初期化されるので↓のコードでもエラーは起きないです
function f(){
if(false){
var a = 1
}
console.log(a)
}
f()


普通無いでしょうけど ローカルで undefined 宣言して別の値を代入してる場合に undefined かの確認には使えそうです
他にも色々ありますけど
function f(arg){
var undefined = "not undefined"
console.log(arg === undefined) // false
console.log(typeof arg === "undefined") // true
console.log(arg === void 0) // true
console.log(arg === [][0]) // true
}
f()
[][0] は多分一番短く書ける方法ですが Array.prototype[0] = 100 などしてしまえば false にできるので他より確実とはいえないかもです

こんなことする人いないでしょうけど