Shell variables don't automagically become awk variables (also in awk, variables are expressed as var, not $var which is the varth field). If you want to pass shell variable to awk, a simple approach is to use the environment:
#! /bin/sh - file=$1 ST=$2 INC=$3 export ST INC awk ' { sep = "" for (i = ENVIRON["ST"]; i <= NF; i += ENVIRON["INC"]) { printf "%c%s", sep, $i sep = OFS } printf "\n" }' < "$file"
Remember to quote your shell variables and that awk can't get arbitrary file names as argument (as it treats some of those with a = in them or one called - specially).
An alternative for passing variables to awk is to use -v awkvar="$shellvar" or awkvar="$shellvar" arguments after the awk script, but those can't be used for arbitrary strings as escape sequences are expanded in them (\\ becomes \ and \n becomes a newline for instance) and with GNU awk 4.2 or above, values that start with @/ and end in / are treated specially unless in POSIX mode.
awk -v st="$st" -v inc="$inc" '{for (i = st; i <= NF; i += inc)...}' < "$file"
or
awk '{for (i = st; i <= NF; i += inc)...}' st="$st" inc="$inc" < "$file"
would be OK here as those variables are only meant to contain numbers (so no backslash).
Whatever you do, don't do:
awk 'for (i = '"$st"'; i <= NF; i += '"$inc"')...'
let alone
awk 'for (i = '$st'; i <= NF; i += '$inc')...'
that is have the shell expand the values of the $st and $inc variables in the code passed to awk, as that makes command injection vulnerabilities (for instance for values of st like system("reboot")).