My first impression is: you have a memory dataset, and 1000 records is not much for an in-memory operation. Did you try? If you did: did you call Disable/EnableControls, or disconnect the visual controls from the datasource?
Try the attached demo. It uses a TBufDataset which comes with the default installation of Lazarus and is a memory dataset (similar to Delphi's ClientDataset). A click on the left button fills the dataset with 10,000 records (integer ID field, float X and Y fields) where the X field contains random integers from 0 to 9. A click on the right button iterates through all the records and replaces the Y value by Y*1000 when X=5. With about 1000 records affected this is completed in some tens of milliseconds.