selecting next todo item from child table
Step by step. First look for not completed object_items, and the min(sequence). This is done with 

-- Select object_items that are *not* completed, find min(sequence)
SELECT
    object_id, min(sequence) AS sequence
FROM
    object_items a
WHERE
    completed = 0 
GROUP BY
    object_id
ORDER BY
    object_id, sequence ;



object_id | sequence
--------: | -------:
       10 |        4
       11 |        3


You can JOIN back with the original table to retrieve the rest of the corresponding row data:

SELECT
    item_name, q.object_id, q.sequence, completed, id
FROM
    (
    -- Select object_items that are *not* completed
    SELECT
        object_id, min(sequence) AS sequence
    FROM
        object_items a
    WHERE
        completed = 0 
    GROUP BY
        object_id
    ) AS q 
    JOIN object_items oi
         ON oi.object_id  = q.object_id 
        AND oi.sequence   = q.sequence
ORDER BY
    q.object_id, q.sequence ;



item_name | object_id | sequence | completed | id
:-------- | --------: | -------: | --------: | -:
DEFG      |        10 |        4 |         0 |  4
CDEF      |        11 |        3 |         0 |  7


The query plan looks reasonable enough to scale well (it does not have a DEPENDENT SUBQUERY that needs reevaluation every time the DB loops):


id | select_type | table      | type   | possible_keys                           | key               | key_len | ref                    | rows | Extra                                       
-: | :---------- | :--------- | :----- | :-------------------------------------- | :---------------- | :------ | :--------------------- | ---: | :-------------------------------------------
 1 | PRIMARY     | &lt;derived2&gt; | ALL    | null                                    | null              | null    | null                   |   10 | Using where; Using filesort                 
 1 | PRIMARY     | oi         | eq_ref | uni_seq_object_id,idx_object_id,idx_seq | uni_seq_object_id | 8       | q.sequence,q.object_id |    1 |                                             
 2 | DERIVED     | a          | ALL    | null                                    | null              | null    | null                   |   10 | Using where; Using temporary; Using filesort


Adding the following index makes the plan even better, because it allows for covering the query named q:

CREATE INDEX idx_object_items_completed_object_id_sequence 
    ON object_items (completed, object_id, sequence) ; 



id | select_type | table      | type   | possible_keys                                 | key                                           | key_len | ref                    | rows | Extra                      
-: | :---------- | :--------- | :----- | :-------------------------------------------- | :-------------------------------------------- | :------ | :--------------------- | ---: | :--------------------------
 1 | PRIMARY     | &lt;derived2&gt; | ALL    | null                                          | null                                          | null    | null                   |    3 | Using where; Using filesort
 1 | PRIMARY     | oi         | eq_ref | uni_seq_object_id,idx_object_id,idx_seq       | uni_seq_object_id                             | 8       | q.sequence,q.object_id |    1 |                            
 2 | DERIVED     | a          | ref    | idx_object_items_completed_object_id_sequence | idx_object_items_completed_object_id_sequence | 1       | const                  |    3 | Using where; Using index   


You can check everything at dbfiddle here