Take a look at the documentation of :normal:
[...] Unfinished last command is aborted as if <esc> or <c-c> was
typed. A ":" should be completed as well. [...]
:normal can change modes but it always ends in a normal mode, even if it isn't reached by the key sequence.
A somewhat ugly but functional workaround is to use nmap, add a mapping, and execute it at the end:
nmap <silent> sl :if filetype('.') == 'link' | exec 'nnoremap _sl cl' | else | exec 'nnoremap _sl :alink<lt>cr>' | endif<cr>_sl