This is because you are creating a new instance of your form section object. The data context is unaware of this object and cannot track it. You need to Attach the object to the context before you use the context features.
eg;
context.Attach(fs);
That being said why don't you rather alter your code to delete by Id rather than create an instance of form section and assign values to it. Your approach just seems unnecessary.
Eg;
public void DeleteSectionQuestion(Form currentForm,CustomSectionTree selectedSectionQuestion, DeleteDelegate callback)
{
foreach (Question q in selectedSectionQuestion.Questions)
{
context.FormSections.Remove(context.FormSections.FirstOrDefault(x => x.FormID == currentForm.FormID));
}
SubmitOperation so = context.SubmitChanges();
so.Completed += (s, args) =>
{
if (so.HasError)
{
so.MarkErrorAsHandled();
callback.Invoke(false, so.Error);
}
else
callback.Invoke(true, null);
};
}