Just wrote a complete answer that they were not implemented, then checked, and found they are..... Well.
The way watches (not watchpoints, but watches/locals) work in Lazarus (with lldb) is that Lazarus does NOT ask lldb to retrieve the watch as typed data. Lazarus only reads raw memory from lldb, and uses its build in dwarf support to format the data.
Since the IDE knows Pascal, this yield better watches displays.
For Watchpoints the IDE currently just hands the name to lldb. (I cant currently test if it works / feel free to supply a log)
Log:
/path/to/lazarus/lazarus.app/Contents/MacOS/lazarus --debug-log=/path/to/yourfiles/laz.log --debug-enable=DBG_CMD_ECHO,DBG_STATE,DBG_DATA_MONITORS,DBGMI_QUEUE_DEBUG,FPDBG_DWARF_ERRORS,FPDBG_DWARF_WARNINGS,FPDBG_DWARF_VERBOSE_LOAD,FPDBG_DWARF_DATA_WARNINGS,DBG_VERBOSE,DBG_WARNINGS,DBG_STATE,DBG_EVENTS,DBG_THREAD_AND_FRAME,DBG_ERRORS
It should send something like
watchpoint set variable var
So lldb must deal with pascal types.
I would guess that may work for simple variables. but maybe not fields of a class, because then lldb must understand how to get the address of the field (it should be able, but not sure if it is in all cases)
Also note:
On intel (I do not know about the new M1), you usually have max 4 watchpoints. Each (up to) the size of a pointer.
So you can not watch an entire class (you can watch read access via the internal pointer, if you assume that every read will first access that pointer. (Well in theory the 4 pointers could cover one record of 32 bytes).
This limit is not lldb based, it is build into the cpu. (for hardware watchpoints. Single stepping and checking all the time is too slow).
Without more info, I cant comment.
Look at the logfile, and see if there is an error.