$ is just a prefix operator used for string by convention.
You are free to do
import strutils
proc `$`(x: string): int =
x.parseInt()
And you can use var y = $x
I do not recommend that at all though.
In the same vein you can define custom operators like $! for int, $@ for float, etc. In general Nim strongly prefers using text rather than operators for searchability and readability. Operators are used when there is a strong convention either from culture (math) or because there is a clear advantage: $ for string conversion, % for JSON conversion, & for seq/string concatenation and string interpolation.
Finally, $int(x) would be parsed as $(int(x)), i.e. convert to int then convert the int to string. $ does not mean "this is a conversion procedure" and is not special-cased in the compiler to read the type that comes after.