Swap the coin's id and data in place with board.setSymbolAt(cell, id, data). It rewrites the ledger entry and returns the new live symbol, so lockedCoins stays correct; repaint the label from the new data. It throws on a free cell, and while a wave is in flight -- await respin() first. On a plain ReelSet the equivalent is reelSet.setSymbolAt(reel, cell, symbolId), which carries no payload.
See it work