With grep and process substitution:
#!/bin/bash
val1='sdb sdc sdd sde sdf sdg sdh sdi sdj sdk'
val2='sdb sdc sdf sdd sde sdg'
val3="$(grep -v -F -f <(printf "%s\n" $val2) <(printf "%s\n" $val1) | xargs)"
echo "$val1"
echo "$val2"
echo "$val3"
The process substitutions with printf "%s\n" are used to make the lists in var1 and var2 appear to be files with one entry per line to grep. var2 is the input "file" to the -f option, and var1 is the "file" to be grepped. xargs is used to convert the output of the grep from multiple lines to a single space separated string...a lazy but useful trick.
And here's the same thing using arrays:
#!/bin/bash
val1=(sdb sdc sdd sde sdf sdg sdh sdi sdj sdk)
val2=(sdb sdc sdf sdd sde sdg)
val3=($(grep -vFf <(printf "%s\n" "${val2[@]}") <(printf "%s\n" "${val1[@]}")))
echo "${val1[@]}"
echo "${val2[@]}"
echo "${val3[@]}"