Because I like brain teasers (not because this sort of thing is practical to do in sed), a possible sed solution is
sed -n '/START/,/STOP/ { //!H; // { g; /^$/! { s/.*\nX | \([^\n]*\).*/\1 ~~/; ta; s/.*/~~/; :a G; s/\n.*Y | \([^\n]*\).*/ \1/; s/\n.*//; p; s/.*//; h } } }'
This works as follows:
/START/,/STOP/ {                        # between two start and stop lines
  //! H                                 # assemble the lines in the hold buffer
                                        # note that // repeats the previously
                                        # matched pattern, so // matches the
                                        # start and end lines, //! all others.
  // {                                  # At the end
    g                                   # That is: When it is one of the
    /^$/! {                             # boundary lines and the hold buffer
                                        # is not empty
      s/.*\nX | \([^\n]*\).*/\1 ~~/     # isolate the X value, append ~~
      ta                                # if there is no X value, just use ~~
      s/.*/~~/
      :a 
      G                                 # append the hold buffer to that
      s/\n.*Y | \([^\n]*\).*/ \1/       # and isolate the Y value so that
                                        # the pattern space contains X ~~ Y
      s/\n.*//                          # Cutting off everything after a newline
                                        # is important if there is no Y value
                                        # and the previous substitution did
                                        # nothing
      p                                 # print the result
      s/.*//                            # and make sure the hold buffer is
      h                                 # empty for the next block.
    }
  }
}