- Its small size (the PUC Lua codebase is about 15000 lines of C and compiles to about 250 kB). PUC Lua is the reference implementation of Lua, as opposed to e.g. LuaJIT.
- Its portability: PUC Lua is written in Clean C, the intersection of ANSI C and C++ 98. That makes it trivially portable to any architecture that matters in games.
- Its performance. PUC Lua is already faster than most popular scripting languages and uses less memory. If you need extra performance you can switch to LuaJIT and come close to C on a lot of codebases.
- The syntax is designed for data description, which makes it a very good language to implement DSLs for lots of things. Also the parser is very efficient so you can store data in Lua files.
- Coroutines. They let you propose an API to users (scripters) that appears synchronous but actually runs in an asynchronous fashion.
- The language is made to be embedded. Its C API is a central point of the design. The interpreter is reentrant so you can run several instances in threads without any problem.
All of this made Lua very popular in the game industry, along with its use in pretty famous games (initially Grim Fandango, then lots of others including World of Warcraft).
Lua is one of the best performing interpreted languages around. If you use LuaJIT, it competes well with the best JS jits. It also has a small memory footprint and reasonably controllable GC pauses.
Lua is very easy to integrate into C/C++ projects. It is easy to write a debugger for Lua. Like everything else in Lua, debugging capabilities are libraries that can just as easily be invoked in Lua itself or in C.
IMHO, very overlooked is that Lua is a batteries-optional language. It comes with a small standard library that keeps it's footprint and capabilities reasonable. If you want more, there are lots of open source libraries you can add. But, more importantly, almost all of the standard libs can be stripped out and Lua will still function just fine. Don't want your scripts to do file IO? Don't load the IO library.
A few years ago I started a simple RPG game engine that uses Lua[0] as its scripting language. I never got very far with it but considering I had zero clue how to even begin approaching the problem when I started I'm pretty happy with how far I got before I lost interest.
I've met quite a few game programmers that don't like parts of Lua, and wish there was something that was closer to C++ rather than JavaScript.