There are of course ways around it, if the calling shell expects to receive
environment data from the child.
The child (tcl-script) would then write the environment to stdout (and
nothing else!) and the outer shell (csh is evil; use bourne shells!):
zsh, bash, ksh or sh:
eval "`script.tcl`"
script.tcl:
#!/usr/bin/env tclsh
puts "export FOO; FOO=foo"
puts "export BAR; BAR='sn afu'"
PS: child process is responsible for protecting meta characters and blanks
in the values.