Chamar pow(1,2) faz o seu compilador resolver esse pow e usar uma constante no lugar. Logo não precisaremos do lm porque seu programa terá as instâncias de pow substituídas pela constante.
Chamar pow(a,b) faz o seu compilador não fazer essa otimização já que pow(a,b) não é constante. Logo precisaremos do -lm, pois precisaremos da função pow.
Experimente compilar seu exemplo utilizando -S (isso te dará um código em linguagem de montagem - boa sorte para entendê-lo! :D).