Instead of using concat(), you can do the string concatenation inside a variable assignment. That allows to write a simple, unescaped ' to mean ':
<xsl:variable name="process-selector">process[@Ref='<xsl:value-of select="$ID"/>']</xsl:variable>
<xsl:value-of select="$process-selector" />
With the recommended way to allow linebreaks without accidentally adding whitespace to the output, this becomes quite lengthy (but that's XSL, right?):
<xsl:variable name="process-selector">
<xsl:text>process[@Ref='</xsl:text>
<xsl:value-of select="$ID"/>
<xsl:text>']</xsl:text>
</xsl:variable>
<xsl:value-of select="$process-selector" />
Full XSL file for this solution to test, for example with an online XSL-T service like xsltransform.net:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html"/>
<xsl:template match="/" name="strip-space" >
<xsl:variable name="ID" select="123"/>
<xsl:variable name="process-selector">
<xsl:text>process[@Ref='</xsl:text>
<xsl:value-of select="$ID"/>
<xsl:text>']</xsl:text>
</xsl:variable>
<xsl:value-of select="$process-selector" />
</xsl:template>
</xsl:transform>