Edit:
Since your input xml already has xsi:nil attribute on empty elements, all you have to do is add <xsl:copy-of select="@xsi:nil"/>
to the parts where you generate the elements.
You could check for each element if the result would be empty:
<xsl:element name="Name">
<xsl:if test="*:Name=''">
<xsl:attribute name="xsi:nil">true</xsl:attribute>
</xsl:if>
<xsl:value-of select="*:Name"/>
</xsl:element>
or to do it all in one go write the accounts to a variable, than loop over the variable and check if empty:
<xsl:template match="*:objects">
<xsl:element name="objects" xmlns="urn:sobject.partner.soap.sforce.com">
<!-- write accounts to variable -->
<xsl:variable name="Accounts">
<xsl:for-each select="*:Account">
<xsl:element name="Account">
<xsl:variable name="fsparentid" select="*:ParentId"/>
<xsl:variable name="fsconsultingfirmid" select="*:Consulting_Firm__c"/>
<xsl:element name="Name">
<xsl:value-of select="*:Name"/>
</xsl:element>
...
</xsl:element>
</xsl:for-each>
</xsl:variable>
<xsl:for-each select="$Account">
<xsl:copy>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test=".=''">
<xsl:copy>
<xsl:attribute name="xsi:nil">true</xsl:.attribute>
</xsl:copy>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:element>
</xsl:template>