The value of your SalesLines property is double-serialized JSON: a string value that contains JSON embedded as a string literal.  You would like to deserialize its contents to a final data model in one step.
To see what the data model should look like, you can unescape the JSON as follows:
var json = JToken.Parse(jsonString);
foreach(var token in json.SelectTokens("value[*].SalesLines").ToList())
{
    token.Replace(JToken.Parse((string)token));
}
Console.WriteLine(json);
Then use one of the code-generation tools mentioned in How to auto-generate a C# class file from a JSON object string to generate a data model from the unescaped JSON (I used http://json2csharp.com/):
public class ItemAttribute
{
    public string AttibuteName { get; set; }
    public string AttributeValue { get; set; }
}
public class SalesLine
{
    public string SONumber { get; set; }
    public int LineNum { get; set; }
    public string ItemId { get; set; }
    public List<ItemAttribute> ItemAttributes { get; set; }
}
public class Value
{
    public string documentType { get; set; }
    public string SONumber { get; set; }
    public List<SalesLine> SalesLines { get; set; }
}
public class RootObject
{
    public List<Value> value { get; set; }
}
Finally, apply EmbeddedLiteralConverter<List<SalesLine>> from this answer to How do I convert an escaped JSON string within a JSON object? to Value:
public class Value
{
    public string documentType { get; set; }
    public string SONumber { get; set; }
    [JsonConverter(typeof(EmbeddedLiteralConverter<List<SalesLine>>))]
    public List<SalesLine> SalesLines { get; set; }
}
Now you will be able to deserialize the JSON to RootObject directly:
root = JsonConvert.DeserializeObject<RootObject>(jsonString);
Demo fiddle here.
>` from [How do I convert an escaped JSON string within a JSON object?](https://stackoverflow.com/a/39154630/3744182) to your `SalesLines` property.
– dbc May 14 '19 at 18:53>)]` to `public List SalesLines { get; set; }` do the job? 
– dbc May 14 '19 at 19:20