Note: Given your use of ${!...} to refer to a variable indirectly, I assume that you're using bash - POSIX-features-only shells and many others do NOT support this feature (at least with this syntax).
Try the following:
HOST_NAME_="localhost:8080"
HOST_NAME_stg="stg.com:8080"
HOST_NAME_qa="qa.com:8080"
HOST_NAME_INDIRECT=HOST_NAME_$1
HOST_NAME=${!HOST_NAME_INDIRECT}
echo -n "${HOST_NAME}"
When referencing a variable indirectly with ${!...}, the argument containing the target variable name must itself be a variable, not a string literal, hence the intermediate variable $HOST_NAME_INDIRECT.
Also consider avoiding all-uppercase variable names to avoid potential conflicts with standard environment variables (such as $HOSTNAME) and special shell variables (such as $SECONDS).
Here's how various popular shells do variable indirection:
Assume the following two variables:
a='value of a'
nameOfA='a'
bash
echo "${!nameOfA}" # -> 'value of a'
# bash 4.3+
declare -n aliasOfA='a' # in functions: `local -n`
echo "$aliasOfA" # same as `echo "$a"` -> 'value of a'
zsh
echo "${(P)nameOfA}" # -> 'value of a'
ksh 93+:
nameref aliasOfA='a' # same as `typeset -n`
echo "$aliasOfA" # same as `echo "$a"` -> 'value of a'
sh (POSIX-features-only shells)
eval echo \"'$'$nameOfA\" # -> 'value of a'
Caveat: Using eval is potentially unsafe. If $nameOfA contained something like 'a; $(rm *)', the rm command would execute too.