Обязательно ли ключевое слово ref для передачи по ссылке?
Без ключевого слова ref (out), параметр всегда передаётся по значению (by value).
В языке есть ссылочные типы и значимые типы (reference type и value types) - вот тут объясняется, в чём разница.
XElement - ссылочный тип. Вы передаёте адрес объекта (в памяти), иными словами - указатель на объект, иными словами - ссылку. Разумеется, при манипуляции с этой областью памяти, изменяется и сам объект.
Отвечая на ваш вопрос, вынесенный в заголовок: для ссылочных типов - нет, не обязательно, для значимых типов - обязательно.
С ref можно сделать такusing System;

public class SomeObj
{
	public int Id { get; set; }
	public string Name { get; set; }
}

public class Program
{
    public static void Main(string[] args)
    {
		SomeObj someObj=new SomeObj() { Id=2, Name="SomeName2" };;
		if (CreateObj(ref someObj))
		{
			Console.Write("{0} {1}", someObj.Id, someObj.Name);
		}
    }
	
	public static bool CreateObj(ref SomeObj obj)
	{
		obj = new SomeObj() { Id=1, Name="SomeName" };
		return true;
	}	
}
В консоли будет 1 SomeName, а без ref будет другой результат, c ref значимые типы по ссылке передаются, а для ссылочных типов передается ссылка на ссылку ( ибо ссылка передается по значению), которую мы можем поменять, можем в методе создать новый объект и присвоить его аргументу, без ref мы присвоим ссылку копии которая лежит в стеке, при передаче аргумента. есть еще и ключевое слово out, от ref отличается тем, что переменная не обязательно должна быть инициализирована.