Some caveats:
[1] Supported SQLCMD scripts in SSMS
https://learn.microsoft.com/en-us/sql/ssms/scripting/edit-sqlcmd-scripts-with-query-editor?view=sql-server-ver15
[2] From the above link, which you appear to have read (a long time ago), read further about the :!!
Then have a look at this as an example
:!!set
...which is the same as this...
!!set
anyway the output shows it's SystemRoot, not systemroot.
[3] SSMS includes the completion time by default
i) Tools > Options > Query Execution > SQL Server > Advanced.
ii) Uncheck the Show Completion Time checkbox.
And so, to the answer...
:out $(SystemRoot)"\the_result.txt"
select * from myTab
:out stdout
I got this...
<p style="color: red">
Unable to redirect output to C:\WINDOWS\the_result.txt. <br>
Access to the path 'C:\WINDOWS\the_result.txt' is denied.<br>
Msg 208, Level 16, State 1, Line 31<br>
Invalid object name 'myTab'.
</p>
...then again, why would I want to output a query to a file in C:\WINDOWS for a table that doesn't exist! ;)
Let's create a test table and the final script is:
--[4] Turn off (x row affected)
set nocount on
GO
create table myTab(
ID int identity(1,1) not null
,colTest varchar(20) null
);
insert into myTab
select 'Hello world';
go
--change the output to be a file in the temporary directory
--This file will be overwritten each time the script is ran
:out $(TEMP)\the_result.txt
--print this to the output
print ' <- [5] There might be squiggly bits'
print '$(SystemRoot)'
select * from myTab
go
--reset the output
:out stdout
--use type to see file contents
!!type %TEMP%\the_result.txt
--let's be tidy
!!del %TEMP%\the_result.txt
drop table myTab
go
Messages output
 <- [5] There might be squiggly bits
C:\WINDOWS
ID colTest
----------- --------------------
1 Hello world
Summary
With doing nothing else, you have access to environment variables once in SQLCMD mode in SSMS
print '$(SystemRoot)'