Quick answer:
ds[0x300a00b0][1][0x300a0111][1][0x300a011a][0][0x300a011c].value[60]=ds[0x300a00b0][1][0x300a0111][1][0x300a011a][0][0x300a011c].value[60]-1
should work.
Explanation:
With code using tag numbers as you have, pydicom returns the DataElement rather than the value of it. But if you ask to
get an index from that data element, pydicom will try to look up that index in the data element's value, which works for Sequence data elements. However,
setting does not do this. So in your code, everything down to the last element is getting, but it is the final list item that is going to be set, then the '.value' has to be there.
This lack of symmetry between getting a data element item and setting an item should probably be fixed in pydicom. We'd have to just think through whether there are any other consequences.
Suggestions for more pythonic/'pydicomic' code:
You can also use the decrement operator here to save some retyping:
ds[0x300a00b0][1][0x300a0111][1][0x300a011a][0][0x300a011c].value[60] -= 1
and using keywords rather than tag numbers makes it easier to figure these kinds of things out, and no need to worry about ".value":
cp = ds.BeamSequence[1].ControlPointSequence[1]
leafjaw = cp.BeamLimitingDevicePositionSequence[0].LeafJawPositions
leafjaw[60] -= 1