Code:
        Dim node As XmlNode = xmlDoc.SelectSingleNode("//DocumentElement/returnset/ID[. ='4']")
        Dim nodev As XmlNode = xmlDoc.SelectSingleNode("//DocumentElement/returnset/EJStatus")
It's updating the first one, because that's what you told it to update... that second selectsinglenode pulls the first instance of the EJStatus it finds... but it's starting relative to the root... not the node where ID =4 ...
what you need to do is start with the selected node (node) and find the sibling "EJStatus" ... which is easy enough because there's a NextSibling method...

so what you end up with should be this (untested)
Code:
    Public Sub SaveXMLFile()

        'Dim xmlDoc As New XmlDataDocumentxmlDoc.Load(dirPath & "jobs3.xml")
        Dim xmlDoc As New XmlDataDocument()
        xmlDoc.Load(dirPath & "jobs3.xml")

        Dim node As XmlNode = xmlDoc.SelectSingleNode("//DocumentElement/returnset/ID[. ='4']")
        Dim nodev As XmlNode = node.NextSibling()

        If nodev IsNot Nothing Then 'It's more important that nodev isn't nothing than it is node...
            nodev.InnerText = "done"
        End If

        xmlDoc.Save(dirPath & "jobs3.xml")

    End Sub
This assumes that EJStatus is the next node following ID... if it isn't... you might need a small loop to check the .NextSibling until the node's name is the right one.

-tg


edit - your looping of the attributes didn't work because there are no attributes... those are all nodes...