I already had to do the same thing. Although I'm not being able to find the code, I found the post that helped me that time. It's written in C# but is easily adaptable to javascript:
public void Test()
{
string webUrl = "http://myserver";
string listName = "docs";
Lists.ListsSoapClient listsClient = this.GetListsClient(webUrl);
// 1st a call to Lists.GetList - we need the list's version - it is returned in the Version attribute
XElement listData = XElement.Parse(listsClient.GetList(listName).OuterXml);
string listID = listData.Attribute("ID").Value;
string version = listData.Attribute("Version").Value;
// in the updateFields parameter of Lists.UpdateList the full schema of the fields should be provided
string updateFields = @"<Fields>
<Method ID='1'>
<Field ID='{28cf69c5-fa48-462a-b5cd-27b6f9d2bd5f}' ColName='tp_Modified' RowOrdinal='0' ReadOnly='FALSE' Type='DateTime' Name='Modified' DisplayName='Modified' StorageTZ='TRUE' SourceID='http://schemas.microsoft.com/sharepoint/v3' StaticName='Modified' FromBaseType='TRUE' Version='4' ShowInNewForm='FALSE' ShowInEditForm='FALSE' />
</Method>
<Method ID='2'>
<Field ID='{8c06beca-0777-48f7-91c7-6da68bc07b69}' ColName='tp_Created' RowOrdinal='0' ReadOnly='FALSE' Type='DateTime' Name='Created' DisplayName='Created' StorageTZ='TRUE' SourceID='http://schemas.microsoft.com/sharepoint/v3' StaticName='Created' FromBaseType='TRUE' Version='4' ShowInNewForm='FALSE' ShowInEditForm='FALSE' />
</Method>
</Fields>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(updateFields);
// Lists.UpdateList: set fields to not read-only
XElement result = XElement.Parse(listsClient.UpdateList(listID, null, null, doc.DocumentElement, null, version).OuterXml);
// get updated version from the result XML - for the second call of Lists.UpdateList
version = result.Elements().Where(el => el.Name.LocalName == "ListProperties").First().Attribute("Version").Value;
// prepare the XML for the list item update
string updateDates = @"<Batch OnError='Continue'>
<Method ID='M0' Cmd='Update'>
<Field Name='ID'>1</Field>
<Field Name='FileRef'>/docs/zt.txt</Field>
<Field Name='Modified'>2010-04-04T22:17:00Z</Field>
<Field Name='Created'>2010-01-01T00:05:00Z</Field>
</Method>
</Batch>";
doc.LoadXml(updateDates);
// Lists.UpdateListItems: update Created & Modified
result = XElement.Parse(listsClient.UpdateListItems(listID, doc.DocumentElement).OuterXml);
// revert the fields' schema
updateFields = updateFields.Replace("ReadOnly='FALSE'", "ReadOnly='TRUE'");
doc.LoadXml(updateFields);
// Lists.UpdateList: set fields back to read-only
result = XElement.Parse(listsClient.UpdateList(listID, null, null, doc.DocumentElement, null, version).OuterXml);
}
Basically we have to set the read-only property of the field as false before we try to update it and, after the update, set that property back to true.
Source:
http://stefan-stanev-sharepoint-blog.blogspot.com.br/2010/04/updating-read-only-fields-with-lists.html