Не знаю, актуально ли, но:
1. Когда ты создаёшь lamp.__index = lamp; и setmetatable( x, lamp ) ты делаешь возможным поиск по lamp, опредедённый внутри же lamp, как в метатаблице твоей таблицы.
Только поиск, больше ничего.
2. А когда ты делаешь { __index = lamp }, ты делаешь поиск по таблице lamp, а вот метатаблица у тебя будет другой - той, которую ты создал.