Rieccomi 
Ho modificato un po' il codice per quello che chiedevi, ora il command viene dichiarato soltanto una volta fuori dal ciclo ed internamente viene soltanto cambiato il valore del parametro.
Ho poi ottimizzato le concatenazioni delle stringhe utilizzando StringBuilder come è sempre consigliabile fare.
Se ci sono problemi o qualcosa che non ti è chiaro chiedimi pure.
codice:
Private Sub sRelazioni(ByRef strFile As String)
Dim strTit As New Text.StringBuilder
Dim fileSb As New Text.StringBuilder(strFile)
Dim indTab As Integer = 0
Dim numRow As Integer = 0
'
Dim conn As New SqlConnection("DATA SOURCE='(local)';INITIAL CATALOG='master';UID='sa';PWD=''")
Dim cmd As New SqlCommand("sp_fkeys", conn)
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Add("@pktable_name", SqlDbType.VarChar)
Dim da As New SqlDataAdapter(cmd)
' ciclo l'array
For indTab = 0 To ElencoTabelle.Length - 1
cmd.Parameters("@pktable_name").Value = ElencoTabelle(indTab)
Dim dt As New DataTable
da.Fill(dt)
numRow = dt.Rows.Count
If numRow > 0 Then
strTit.Remove(0, strTit.Length)
For Each row As DataRow In dt.Rows
'Ciclo le righe
If strTit.ToString() <> ElencoTabelle(indTab) Then
strTit.Append(" * ")
strTit.Append(ElencoTabelle(indTab))
fileSb.AppendFormat("{0}{1}{0}", Environment.NewLine, strTit)
End If
fileSb.AppendFormat(" - {0}, ", row("FK_NAME").Value.ToString())
fileSb.AppendFormat("{0}, ", row("PKTABLE_NAME").Value.ToString())
fileSb.AppendFormat("{0}, ", row("FKTABLE_NAME").Value.ToString())
fileSb.AppendFormat("{0}, ", row("PKCOLUMN_NAME").Value.ToString())
fileSb.AppendFormat("{0}, {1}", row("FKCOLUMN_NAME").Value.ToString(), Environment.NewLine)
Next
End If
dt.Dispose()
Next
da.Dispose()
cmd.Dispose()
conn.Dispose()
strFile = fileSb.ToString()
End Sub