Потому что он в первом варианте пытается имеено получить свойство val. Это тоже самое что lookup["val"], то есть строчное значение "val". А во втором варианте запрашивается свойство по значению переменной val. То есть если val = "my_value", то будет получен lookup[val] === lookup["my_value"]