Да, так происходит, потому что в конце цикла с2 принимает последнее значение и оно же везде и будет использоваться.
Вот решение:

Код AS1/AS2:
for (var c2 = 2; c2 <= 25; c2++)
{
var btn:MovieClip = _root.cam2["e" + c2]; //ссылка на кнопку для удобства записи
btn.num = c2; //"запоминаем" номер внутри кнопки
//функции на события назначаем по ссылке на именованные функции:
btn.onRollOver = mykOnRollover;
btn.onRollOut = mykOnRollout;
}
function mykOnRollover()
{
var num:Number = this.num; //"вспоминаем" номер
_root.cam2["e" + num]._alpha = _root["cam2"]["l" + num]._alpha = max_transparancy;
}
function mykOnRollout()
{
var num:Number = this.num; //"вспоминаем" номер
_root.cam2["e" + num]._alpha = _root.cam2["l" + num]._alpha = min_transparancy;
}
1. Не склеивайте операторы, ставьте пробелы. Это не круто на самом деле.

Только читать и править код неудобно. Пользы никакой - компилятор потом все равно сделает как ему удобнее.
2. Названия функций не делайте с заглавной, с заглавной обычно идут названия классов.
И еще, если я верно определил, то внутри функции при задании действий на кнопку вы опять ссылаетесь на нее саму. Поэтому можно записать так, с использованием относительных путей:

Код AS1/AS2:
this._alpha = this._parent["l" + num]._alpha = max_transparancy;
this._parent - в данном случае это ссылка на родительский мувик
_root.cam2 из мувика
_root.cam2["e" + num]
Код функций станет гибче и не будет зависеть от имени.