At first, I want to point out a basic issue of the if/else clause:
if "%env%"==%%A echo true else goto end
The parser treats the entire portion after the comparison expression as a single command line, hence if the comparison is positive, true else goto end is going to be echoed. To solve that you need to show the parser where the if statement ends by placing parentheses, like this...:
if "%env%"=="%%~A" (echo true) else goto end
...or this, if you want to spread it over multiple lines:
if "%env%"=="%%~A" (
    echo true
) else (
    goto end
)
In addition, I replaced %%A by "%%~A" to ensure that the right part of the comparison expression is always placed within quotes even in case you provided a list of strings like "aaa" bbb "ccc" ddd.
As far as I understand you want to go to :end in case the first argument %1 does not match any of the given strings. There is a logical error in your code, because you will always jump to :end even if a match has been encountered (as there are still three mismatches then), so the else clause is for sure going to be executed (supposing you corrected the if/else syntax as described earlier).
You could change the code as follows (using a FLAG variable indicating that a match has been found):
set "FLAG="
for %%A in ("aaa" "bbb" "ccc" "ddd") do (
    if "%~1"=="%%~A" (
        set "FLAG=true"
    )
)
if not defined FLAG goto :end
rem // Execution continues here in case a match has been found...
Alternatively, you could do this (using another goto to leave the loop):
for %%A in ("aaa" "bbb" "ccc" "ddd") do (
    if "%~1"=="%%~A" (
        goto :found
    )
)
goto :end
:found
rem // Execution continues here in case a match has been found...
Note that the above code snippets do case-sensitive string comparisons; to change that, use if /I.