Use o comando shift para empurrar os argumentos posicionais conforme necessário. No seu caso, fazer shift 1 separaria $1 (ou seja, o primeiro argumento) do resto dos argumentos. Da mesma forma, shift 2 mudaria os primeiros 2 argumentos da lista de argumentos e assim por diante. E lembre-se sempre de citar suas variáveis / argumentos para não deixarem passar pela divisão de palavras pelo shell.
#!/bin/bash
exec_command -k -q "$1"
shift 1
for i in "$@"; do
grep --color=always "$i" file
done
Consulte a página do manual shift para entender mais. Esta é uma opção compatível com POSIX disponível em shells.
Ou outra maneira de fazer ( bash specific) uma expansão baseada em índice na lista de argumentos $@ como abaixo para iniciar o loop do segundo elemento nas alas.
#!/bin/bash
exec_command -k -q "$1"
for i in "${@:2}"; do
grep --color=always -- "$i" file
done
Além de iterar sobre os argumentos posicionais na primeira abordagem, você faz exatamente
for i; do
grep --color=always -- "$i" file
done