Index: wp-admin/includes/class-wp-screen.php
===================================================================
--- wp-admin/includes/class-wp-screen.php	(revision 43660)
+++ wp-admin/includes/class-wp-screen.php	(working copy)
@@ -1187,7 +1187,27 @@
 		<legend><?php _e( 'Pagination' ); ?></legend>
 			<?php if ( $per_page_label ) : ?>
 				<label for="<?php echo esc_attr( $option ); ?>"><?php echo $per_page_label; ?></label>
-				<input type="number" step="1" min="1" max="999" class="screen-per-page" name="wp_screen_options[value]"
+				<?php
+				/**
+				 * Filters a screen option per page max value for html validation.
+				 *
+				 * Returning value to set as max allowed value for html validation
+				 * of `Number of items per page` input field.
+				 *
+				 * @since 4.9.9
+				 *
+				 * @param int $max_value The value per page max value using for
+				 * HTML validation.
+				 */
+				$max_value = apply_filters( 'screen_per_page_max_value', 999 );
+
+				// to not allow user to set more than the default value.
+				if ( empty( $max_value ) || $max_value < 0 || $max_value > 999 ) {
+					$max_value = 999;
+				}
+
+				?>
+				<input type="number" step="1" min="1" max="<?php echo esc_attr( $max_value ); ?>" class="screen-per-page" name="wp_screen_options[value]"
 					id="<?php echo esc_attr( $option ); ?>" maxlength="3"
 					value="<?php echo esc_attr( $per_page ); ?>" />
 			<?php endif; ?>
Index: wp-admin/includes/misc.php
===================================================================
--- wp-admin/includes/misc.php	(revision 43660)
+++ wp-admin/includes/misc.php	(working copy)
@@ -630,7 +630,22 @@
 			case 'themes_network_per_page':
 			case 'site_themes_network_per_page':
 				$value = (int) $value;
-				if ( $value < 1 || $value > 999 ) {
+
+				/**
+				 * Filters a screen option per page value before it is set.
+				 *
+				 * The filter can also be used to restrict user to set max value
+				 * of `Number of items per page`.
+				 *
+				 * Returning value to set as `Number of items per page`.
+				 *
+				 * @since 4.9.9
+				 *
+				 * @param int $value The number of rows to use.
+				 */
+				$value = apply_filters( 'set_screen_option_per_page', $value );
+
+				if ( empty( $value ) || $value < 1 || $value > 999 ) {
 					return;
 				}
 				break;
